我的数据库结构是这样的。
{
_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,它只是神奇地工作。我还是不知道发生了什么。
答案 0 :(得分:0)
看起来你的结构可能包含类似的条目(每个objectId),然后$unwind
然后$group
它们变得可见。
为避免这种变化:
'dates' : { '$push' : '$dates' }
要:
'dates' : { '$adToSet' : '$dates' }
因为这只会为数组添加唯一值