これは、別の要素と一致する必要がある配列に一連のデータを追加するための最良の方法に関する質問です。2.2 Aggregationフレームワークを使用しようとしていますが、単純なグループでこれを実行できる可能性があります。
したがって、特定のドキュメントセットに対して、次のような出力を取得しようとしています。
{
"result" : [
{
"_id" : null,
"numberOf": 2,
"Sales" : 468000,
"profit" : 246246,
}
],
"ok" : 1
}
さて、私はもともと、名前付きプロパティに割り当てられた値を含むドキュメントのリストを持っていました。
[
{
_id : 1,
finance: {
sales: 234000,
profit: 123123,
}
}
,
{
_id : 2,
finance: {
sales: 234000,
profit: 123123,
}
}
]
これは簡単に合計できましたが、他の理由で構造が機能しませんでした。たとえば、「finance」のような他の列があり、何千ものインデックスを作成せずにそれらのインデックスを作成できるようにしたいので、このような構造に変換する必要があります。
[
{
_id : 1,
finance: [
{
"k": "sales",
"v": {
"description":"sales over the year",
v: 234000,
}
},
{
"k": "profit",
"v": {
"description":"money made from sales",
v: 123123,
}
}
]
}
,
{
_id : 2,
finance: [
{
"k": "sales",
"v": {
"description":"sales over the year",
v: 234000,
}
},
{
"k": "profit",
"v": {
"description": "money made from sales",
v: 123123,
}
}
]
}
]
必要に応じてfinance.kのインデックスを作成できますが、特定のキーに一致するすべての数値を合計するための集計クエリを作成するのに苦労しています。これが私が最初に名前付きプロパティを選んだ理由ですが、これは実際には何千もの「k」ラベルがある状況で機能する必要があります。
新しいフレームワークを使用してこのための集約クエリを構築する方法を知っている人はいますか?私はこれを試しました。
db.projects.aggregate([
{
$match: {
// QUERY
$and: [
// main query
{},
]
}
},
{
$group: {
_id: null,
"numberOf": { $sum: 1 },
"sales": { $sum: "$finance.v.v" },
"profit": { $sum: "$finance.v.v" },
}
},
])
しかし、私は得ます。
{
"errmsg" : "exception: can't convert from BSON type Array to double",
"code" : 16005,
"ok" : 0
}
**追加の賞賛のために、MapReduceクエリでもこれを実行できる必要があります。