我有一个名为' Dealer'以下字段。
1)userId 2)dealerId 3)代码 4)原产地(具有价值观' UUM',' MMT',' TTC')
在上面的集合中,我需要通过(userId + dealerId)的独特组合获得独特的经销商记录。如果两个记录具有相同的&user;' userId'和' dealerId'那么我需要检查原点字段和记录的值不等于' UUM'需要在结果集中返回。
这就是我现在所达到的目标:
db.dealer.aggregate(
[
{
$sort: { origin: 1 }
},
{
$group:
{
_id: {
dealerId:"$dealerId",
recordId:"$recordId"
},
origin: {
$first: "$origin"
}
}
}
])
如何为上述场景进行聚合查询。非常感谢。
提前致谢。
答案 0 :(得分:1)
为减少内存使用量,我会过滤掉没有UUM来源的文档。 然后由经销商和用户组成。
我不确定您为什么要按经销商+记录进行排序和分组。
> db.dealerTest.find()
{ "_id" : 1, "userId" : "u1", "dealerId" : "d1", "code" : 1, "origin" : "UUM" }
{ "_id" : 2, "userId" : "u1", "dealerId" : "d1", "code" : 2, "origin" : "UUM" }
{ "_id" : 3, "userId" : "u1", "dealerId" : "d1", "code" : 3, "origin" : "TTC" }
{ "_id" : 4, "userId" : "u2", "dealerId" : "d1", "code" : 4, "origin" : "TTC" }
{ "_id" : 5, "userId" : "u2", "dealerId" : "d1", "code" : 5, "origin" : "MMT" }
{ "_id" : 6, "userId" : "u2", "dealerId" : "d2", "code" : 6, "origin" : "UUM" }
代码:
db.dealerTest.aggregate([{
$match: {
origin: {
$ne: "UUM"
}
}
}, {
$group: {
_id: {
dealerId: "$dealerId",
userId: "$userId"
},
docIds: { $addToSet : "$_id" },
origins: { $addToSet : "$origin" }
}
}]);
输出:
{ "_id" : { "dealerId" : "d1", "userId" : "u2" }, "docIds" : [ 5, 4 ], "origins" : [ "MMT", "TTC" ] }
{ "_id" : { "dealerId" : "d1", "userId" : "u1" }, "docIds" : [ 3 ], "origins" : [ "TTC" ] }