我有以下表结构:
出租:
{
'_id' : '1',
'user_id' : 1,
'item_id' : 6,
'name' : "First rental",
}
{
'_id' : '2',
'user_id' : 2,
'item_id' : 7,
'name' : "Second rental",
}
{
'_id' : '3',
'user_id' : 2,
'item_id' : 8,
'name' : "Third rental",
}
我想要一个按用户分组的租借列表,如下所示:
{
'user' : '1',
'rental_count': 1,
'rentals' : [
{
'_id' : '1',
'item_id' : 6,
'name' : "First rental"
}
]
'user' : '2',
'rental_count: 2',
'rentals' : [
{
'_id' : '2',
'item_id' : 7,
'name' : "Second rental"
},
{
'_id' : '3',
'item_id' : 8,
'name' : "Third rental"
},
]
}
如何使用mongodb(我可以在必要时使用聚合框架)。
我尝试过这样的事情:
self.collection.aggregate([
{'$group' => {_id: {user_id: '$user_id'},
rental_items: {'$addToSet' => '$item_id'}
rental_ids: {'$addToSet' => '$_id'}
}
]},
但它永远不会奏效,因为我有很多不同的租赁信息,我希望每个用户都能在一个阵列中租用。
答案 0 :(得分:1)
您发布的汇总查询似乎是正确的,只有您必须将对象传递给$addToSet
:
db.rentals.aggregate({ "$group" :
{ _id: "$user_id",
rental_count : {$sum : 1},
rentals : {'$addToSet' :
{ "item_id" : '$item_id',
"rental_id" : "$_id",
"name" : "$name"
}
} } } );
根据您的样本数据,结果为
{
"result" : [
{
"_id" : 2,
"rental_count" : 2,
"rentals" : [
{
"item_id" : 8,
"rental_id" : "3",
"name" : "Third rental"
},
{
"item_id" : 7,
"rental_id" : "2",
"name" : "Second rental"
}
]
},
{
"_id" : 1,
"rental_count" : 1,
"rentals" : [
{
"item_id" : 6,
"rental_id" : "1",
"name" : "First rental"
}
]
}
],
"ok" : 1
}
这没有你想要的确切命名,但改变这是最容易的部分,我不想偷走所有的乐趣: - )