除非您以某种方式进行修改,否则您的“最新”文档将始终位于数组的末尾。当与$push运算符或在客户端代码中使用数组操作方法添加。
只有运营商喜欢$addToSet或显式使用修饰符$push
操作将改变这一点。
因此,当位于数组末尾时,您通常想要做的是使用$slice,使用负索引从数组的“末尾”获取项目:
Model.findById("55d3a39565698bbc68079e31")
.select({ "comments": { "$slice": -1 }})
.exec(function(err,doc) {
})
如果您实际上已经按照前面提到的方式修改了数组,其中最新日期不是数组中的最后一个元素,那么您应该使用$sort更新修改器。如果你要求的话,通常只会“不合适”$position
修饰符或者你使用过$addToSet
. The $position
这是故意的,您也不能排序,但您始终可以在$addToSet
像这样的操作,将所有日期按顺序排列,而不更改数组的任何其他内容:
Model.findByIdAndUpdate("55d3a39565698bbc68079e31",
{ "$push": { "comments": { "$each": [], "$sort": { "date": 1 } } } }
)
与数组修改相同$slice
操作适用于查询,因为数组现在按日期排序。
但是,如果您的目的是让文档中的数组不按顺序排列,或者按照您想要的其他顺序排列,但您还想获取最新日期,那么您可以使用.aggregate() to $sort并检索$last数组条目:
Model.aggregate(
[
{ "$match": { "_id": ObjectID("55d3a39565698bbc68079e31") } },
{ "$unwind": "$comments" },
{ "$sort": { "comments.date": 1 } },
{ "$group": {
"_id": "$_id",
"author": { "$first": "$author" },
"link": { "$first": "$link" },
"title": { "$first": "$title" },
"date": { "$first": "$date" },
"comments": { "$last": "$comments" }
}}
]
)
请注意,当将聚合框架与猫鼬一起使用时,_id
在其他查询中发生的“自动转换”不会发生(这是设计使然),因此有必要转换为ObjectId
如果数据尚未以该形式提供并且已作为字符串输入,请对自己进行评估。
这些是从数组中获取最后一个元素(可选地显式排序)的方法。