フィールド名でグループ化することはできますか?または、値でグループ化できるように別の構造が必要ですか?
group by on値を使用でき、配列をほどくことができますが、「apples」、「pears」、「oranges」を明示的に指定しなくても、ここの3つの家の中でJohnが所有するリンゴ、梨、オレンジの合計を取得することは可能です。クエリの一部?(したがって、これは好きではありません);
// total all the fruit John has at each house
db.houses.aggregate([
{
$group: {
_id: null,
"apples": { $sum: "$people.John.items.apples" },
"pears": { $sum: "$people.John.items.pears" },
"oranges": { $sum: "$people.John.items.oranges" },
}
},
])
言い換えると、「アイテム」の下の最初のフィールド名でグループ化して、リンゴ:104、ナシ:202、オレンジ:306の合計だけでなく、バナナ、メロン、その他の可能性のあるものを取得できますか?または、データをカテゴリのようなキーと値のペアの配列に再構築する必要がありますか?
db.createCollection("houses");
db.houses.remove();
db.houses.insert(
[
{
House: "birmingham",
categories : [
{
k : "location",
v : { d : "central" }
}
],
people: {
John: {
items: {
apples: 2,
pears: 1,
oranges: 3,
}
},
Dave: {
items: {
apples: 30,
pears: 20,
oranges: 10,
},
},
},
},
{
House: "London", categories: [{ k: "location", v: { d: "central" } }, { k: "type", v: { d: "rented" } }],
people: {
John: { items: { apples: 2, pears: 1, oranges: 3, } },
Dave: { items: { apples: 30, pears: 20, oranges: 10, }, },
},
},
{
House: "Cambridge", categories: [{ k: "type", v: { d: "rented" } }],
people: {
John: { items: { apples: 100, pears: 200, oranges: 300, } },
Dave: { items: { apples: 0.3, pears: 0.2, oranges: 0.1, }, },
},
},
]
);
次に、さらに重要なことに、「house.categories.k」でグループ化することもできますか?言い換えれば、「賃貸」と「所有」または「友人」の家(「categories.k.type」でグループ化)に「リンゴ」「ジョン」がいくつあるかを知ることは可能ですか?
最後に-これが可能である場合でも、それは賢明ですか?最初は、オブジェクトの実際のフィールド名を使用してネストされたオブジェクトの辞書を作成することは非常に便利だと思いました。これは、ドキュメントデータベースの論理的な使用法のようであり、MRクエリを配列よりも簡単に記述できるように見えたためです。これがすべて悪い考えであるかどうか疑問に思い始めており、可変フィールド名を使用すると、集計クエリを作成するのが非常にトリッキー/非効率になります。