我有一个联系人集合,其文档类似于:
{ Name: "John Doe", BirthDate: ISODate("1980-03-12T00:00:00.000Z"), Address: "..." }
我需要获取所有文档,按 BirthDate 字段的月部分排序。 结果必须包括文档的所有字段。这个想法是向用户显示每个月的哪些联系人都有生日。
我尝试构建聚合,但无法弄清楚如何使用$month
运算符对 BirthDate 字段进行排序。
也许我可以使用$group
,但如何让它显示文档的所有字段?
答案 0 :(得分:2)
有一个技巧,根据你想做什么,你可以采取几种方法。最简单的是在聚合管道中使用$project。
我正在使用子集了解我对你的领域的知识,但一般的概念是在$project阶段定义所有这些,加上附加字段:
db.collection.aggregate([
// You probably want to do some matching first
// Project your altered document form with a *new* field for "month"
{"$project": {
"Name": 1,
"BirthDate": 1,
"Address": 1,
"month": { "$month": "$BirthDate" } // Extra field for "month"
}},
// Sort by your month value
{"$sort": { "month": 1 }},
// Then just clean the extra part from your projection
// ( if you need to )
{"$project": {
"Name": 1,
"BirthDate": 1,
"Address": 1,
}},
])
如果你需要做一些更复杂的事情,那将涉及某种形式的分组或其他操作,只要你做的事情,保存文件在_id
喜欢在整个文档上进行分组:
db.collection.aggregate([
// Save your document in the `_id` field
{"$project": {
_id: {
_id: "$_id",
"Name": 1,
"BirthDate": 1,
"Address": 1
}
}},
此处发布了更多示例用法:
How to get back the Original document back after aggregation