如何在 Mongoose 中检索嵌入文档中数组的最后一个对象?

2023-12-10

我在编写查询来检索 Story 文档中嵌入的 Comments 数组的最后一个对象时遇到问题。

当我执行 db.stories.find() 时,我的集合当前看起来像这样:

{
"_id" : ObjectId("55d3a39565698bbc68079e31"),
"author" : "Steven Chen",
"link" : "COCO",
"title" : "COCO",
"date" : ISODate("2015-08-18T21:28:53.629Z"),
"comments" : [
    {
        "author" : "Steven",
        "text" : "Major",
        "_id" : ObjectId("55d3a39565698bbc68079e32"),
        "date" : ISODate("2015-08-18T21:28:53.632Z")
    },
    {
        "text" : "Canada",
        "author" : "Steven",
        "_id" : ObjectId("55d3a39a65698bbc68079e33"),
        "date" : ISODate("2015-08-18T21:28:58.001Z")
    },
    {
        "text" : "Usa",
        "author" : "Steven",
        "_id" : ObjectId("55d3a39c65698bbc68079e34"),
        "date" : ISODate("2015-08-18T21:29:00.877Z")
    }
],
"__v" : 0
}

我想根据给定 Story 文档 _id 的日期检索最后一条评论。

我的代码的上下文是,有一篇带有评论列表的 Story 帖子,我想检索最后一条评论并使用 ajax 将其作为 JSON 发送到我的客户端 JS,以便可以使用最新/最新的评论来更新视图。

在这种情况下,带有“text:”Usa”的评论应该是被检索的评论。

有人可以提供正确的方法来做到这一点吗?如果你能解释为什么会更好?谢谢你!


除非您以某种方式进行修改,否则您的“最新”文档将始终位于数组的末尾。当与$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如果数据尚未以该形式提供并且已作为字符串输入,请对自己进行评估。

这些是从数组中获取最后一个元素(可选地显式排序)的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Mongoose 中检索嵌入文档中数组的最后一个对象? 的相关文章

随机推荐