MongoDB在.aggregate()中生成重复项

时间:2016-06-04 03:34:25

标签: mongodb

我的数据库结构是这样的。

    {
      _id : ObjectId(...),
      no : 2,
      dates : [
        { year : 2016, month : 3, grade : {} },
        { year : 2016, month : 2, grade : {} },
        { year : 2016, month : 1, grade : {} },
      ]
    },
    {
      _id : ObjectId(...),
      no : 1,
      dates : [
        { year : 2016, month : 3, grade : {} },
        { year : 2016, month : 2, grade : {} },
        { year : 2016, month : 1, grade : {} },
      ]
    }

现在,我需要找到一份文件,然后按年按月分类。我在下面有以下代码:

    db.something.aggregate([
      { '$match' : { 'no' : 2 }},
      { '$unwind' : '$dates'},
      { '$sort' : {
        'dates.year' : 1,
        'dates.month' : 1
      }},
      { '$group' : {
        '_id' : '$no',
        'dates' : { '$push' : '$dates' }
      }}
    ]).pretty();

我认为我正确地接近它但它以某种方式产生重复。像这样:

    {
      _id : ObjectId(...),
      no : 2,
      dates : [
        { year : 2016, month : 1, grade : {} },
        { year : 2016, month : 1, grade : {} },
        { year : 2016, month : 2, grade : {} },
        { year : 2016, month : 2, grade : {} },
        { year : 2016, month : 3, grade : {} },
        { year : 2016, month : 3, grade : {} },
      ]
    }

如果我删除$sort$group,则结果不包含重复项。我很确定我插入了一切正确,它没有重复或我的数据库中的任何东西。你认为它有什么问题?关于我应该如何继续,我完全是空白。

非常感谢!

[编辑]

好的,我只是重新安装了MongoDB,它只是神奇地工作。我还是不知道发生了什么。

1 个答案:

答案 0 :(得分:0)

看起来你的结构可能包含类似的条目(每个objectId),然后$unwind然后$group它们变得可见。

为避免这种变化:

'dates' : { '$push' : '$dates' }

要:

'dates' : { '$adToSet' : '$dates' }

因为这只会为数组添加唯一值