是否可以按字段名称分组?还是我需要一个不同的结构,以便我可以按值分组?
我知道我们可以在值上使用 group by 并且我们可以展开数组,但是是否可以在这里的三个房子中获得 John 拥有的苹果、梨和橙子的总数,而无需明确指定“apples”、“pears”和“oranges”为查询的一部分?(所以不喜欢这样);
// 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 查询更容易编写 vs 数组,但现在我'我开始怀疑这是否都是一个坏主意,并且具有可变字段名称会使编写聚合查询变得非常棘手/效率低下。