MongoDB - 逐列删除重复值

时间:2017-12-27 18:24:32

标签: mongodb

Mongodb Collection - :

    {
"_id" : ObjectId("59b0fdea8711111"),
"address" : {
    "building" : "123",
},
"borough" : "Manhattan",
"grades" : [ 
    {
        "grade" : "A",
        "score" : 8
    }, 
    {
        "grade" : "B",
        "score" : 23
    }, 
    {
        "grade" : "A",
        "score" : 12
    }, 
],
"name" : "Glorious Food",
"restaurant_id" : "30112340"

}

我需要按年级对所有人进行分组,然后列出该等级的所有姓名。 当我运行我的代码时,我得到了它,但我有重复的值,你可以看到实体有3个等级,其中2个有A等级,所以实体将在我的列表中出现两次 这是我的代码:

    db.getCollection('restaurants').aggregate([
{$project:{
    "borough":1,
    "grades.grade":1,
    "name":1
    }},                                    
{$match:{"borough":"Manhattan"}},
{$unwind:"$grades"},
{$group:{
    "_id":"$grades",
    name:{$push: {restname:"$name"}}}},
 {$sort:{"_id":1}}


])

这是我输出的一个例子

    {
"_id" : {
    "grade" : "A"
},
"name" : [ 
    {
        "restname" : "Glorious Food"
    }, 
    {
        "restname" : "Glorious Food"
    {
        "restname" : "1 East 66Th Street Kitchen"
    }, 

底线,我希望每个年级的restname都是不同的

谢谢!

1 个答案:

答案 0 :(得分:0)

我假设您的代码执行了类似的操作:

db.collection.aggregate([
{ $unwind: "$grades"},
{
  $group: {
    _id: { grade: "$grades.grade"},
    name: { $push: { restname: "$name"}}
  }
}
])

您需要使用$addToSet代替$push

db.collection.aggregate([
{ $unwind: "$grades"},
{
  $group: {
    _id: { grade: "$grades.grade"},
    name: { $addToSet: { restname: "$name"}}
  }
}
])

此处$addToSet

的行为
  

$ addToSet仅确保没有重复项添加到   设置并不会影响现有的重复元素。 $ addToSet   不保证修改集中元素的特定排序。