【问题标题】:Returning inner array elements from multiple document in sorted form以排序形式从多个文档返回内部数组元素
【发布时间】:2015-12-02 16:37:58
【问题描述】:

嘿,我的收藏是这样的,我正在尝试按日期排序的顺序获取特定 blog_id 的所有 cmets 列表。

    [
{
    "_id" : ObjectId("565f0f5d77f0c7bd11bbadd8"),
    "blog_id" : ObjectId("56587befdb7224110f007233"),
    "comments" : [
        {
            "user_id" : ObjectId("562fa014888806820e21e0df"),
            "user_full_name" : "Niroj Paudel",
            "comment" : "pradip is bhole baba",
            "_id" : ObjectId("565f0f5d77f0c7bd11bbadd9"),
            "dt" : ISODate("2015-12-02T15:33:49.578Z")
        },
        {
            "user_id" : ObjectId("562fa014888806820e21e0df"),
            "user_full_name" : "Niroj Paudel",
            "comment" : "honkog pokhara... he he ha ha",
            "_id" : ObjectId("565f1034fd07cbfc1129db0b"),
            "dt" : ISODate("2015-12-02T15:37:24.581Z")
        }
    ],
    "record_count" : 2,
    "__v" : 0
}


{
    "_id" : ObjectId("565efa37635f09900d21a339"),
    "blog_id" : ObjectId("56587befdb7224110f007233"),
    "comments" : [
        {
            "user_id" : ObjectId("562fa014888806820e21e0df"),
            "user_full_name" : "Niroj Paudel",
            "comment" : "wat a nice car wow",
            "_id" : ObjectId("565efa37635f09900d21a33a"),
            "dt" : ISODate("2015-12-02T14:03:35.289Z")
        },
        {
            "user_id" : ObjectId("562fa014888806820e21e0df"),
            "user_full_name" : "Niroj Paudel",
            "comment" : "love is life budikhola ma dives",
            "_id" : ObjectId("565efa76635f09900d21a33b"),
            "dt" : ISODate("2015-12-02T14:04:38.661Z")
        },
        {
            "user_id" : ObjectId("562fa014888806820e21e0df"),
            "user_full_name" : "Niroj Paudel",
            "comment" : "bholi ajaya ko bihe",
            "_id" : ObjectId("565efaa0635f09900d21a33c"),
            "dt" : ISODate("2015-12-02T14:05:20.847Z")
        },
        {
            "user_id" : ObjectId("562fa014888806820e21e0df"),
            "user_full_name" : "Niroj Paudel",
            "comment" : "manish is nice",
            "_id" : ObjectId("565efb17635f09900d21a33d"),
            "dt" : ISODate("2015-12-02T14:07:19.704Z")
        },
        {
            "user_id" : ObjectId("562fa014888806820e21e0df"),
            "user_full_name" : "Niroj Paudel",
            "comment" : "niroj is cool",
            "_id" : ObjectId("565efd53c22dddc80e8f461c"),
            "dt" : ISODate("2015-12-02T14:16:51.730Z")
        },
        {
            "user_id" : ObjectId("562fa014888806820e21e0df"),
            "user_full_name" : "Niroj Paudel",
            "comment" : "ramesh is cool",
            "_id" : ObjectId("565f0d376d82e24c11f6c0d1"),
            "dt" : ISODate("2015-12-02T15:24:39.010Z")
        }
    ],
    "record_count" : 6,
    "__v" : 0
}
]

我想按日期的降序列出特定 blog_id 的所有 cmets,如下所示

[ { "user_id" : ObjectId("562fa014888806820e21e0df"), "user_full_name" : "Niroj Paudel", "comment" : "wat a nice car wow", "_id" : ObjectId("565efa37635f09900d21a33a"), "dt" : ISODate("2015-12-02T14:03:35.289Z") }, { "user_id" : ObjectId("562fa014888806820e21e0df"), "user_full_name" : "Niroj Paudel", "comment" : "love is life budikhola ma dives", "_id" : ObjectId("565efa76635f09900d21a33b"), "dt" : ISODate("2015-12-02T14:04:38.661Z") }, { "user_id" : ObjectId("562fa014888806820e21e0df"), "user_full_name" : "Niroj Paudel", "comment" : "bholi ajaya ko bihe", "_id" : ObjectId("565efaa0635f09900d21a33c"), "dt" : ISODate("2015-12-02T14:05:20.847Z") }, { "user_id" : ObjectId("562fa014888806820e21e0df"), "user_full_name" : "Niroj Paudel", "comment" : "manish is nice", "_id" : ObjectId("565efb17635f09900d21a33d"), "dt" : ISODate("2015-12-02T14:07:19.704Z") }, { "user_id" : ObjectId("562fa014888806820e21e0df"), "user_full_name" : "Niroj Paudel", "comment" : "niroj is cool", "_id" : ObjectId("565efd53c22dddc80e8f461c"), "dt" : ISODate("2015-12-02T14:16:51.730Z") }, { "user_id" : ObjectId("562fa014888806820e21e0df"), "user_full_name" : "Niroj Paudel", "comment" : "ramesh is cool", "_id" : ObjectId("565f0d376d82e24c11f6c0d1"), "dt" : ISODate("2015-12-02T15:24:39.010Z") } { "user_id" : ObjectId("562fa014888806820e21e0df"), "user_full_name" : "Niroj Paudel", "comment" : "pradip is bhole baba", "_id" : ObjectId("565f0f5d77f0c7bd11bbadd9"), "dt" : ISODate("2015-12-02T15:33:49.578Z") }, { "user_id" : ObjectId("562fa014888806820e21e0df"), "user_full_name" : "Niroj Paudel", "comment" : "honkog pokhara... he he ha ha", "_id" : ObjectId("565f1034fd07cbfc1129db0b"), "dt" : ISODate("2015-12-02T15:37:24.581Z") } ]

如何在 mongooes 或 mongodb 中做到这一点

我试过了

BlogComments.aggregate([

            {$match:{blog_id:blogId}},
            {
                $group:{
                    _id:statusId,comment_count:{$sum:"$record_count"},comments:{$push:"$comments"}
                 }
            },
            { "$unwind": "$comments" },
            { "$unwind": "$comments" },


            { "$group": {
                "_id": statusId,
                "comment_count": { "$first": "$comment_count" },
                "comments": { "$addToSet": "$comments" }
            }},
            { $sort: {'comments._id': 1}}


        ]);

此查询提供来自多个文档的注释和所有关联的 cmets,但 cmets 的顺序是随机的。 $sort 不适合我

提前谢谢你。

【问题讨论】:

  • 约翰,你有什么尝试吗?
  • 是的,但是评论列表是随机的,没有排序......我使用了聚合框架与 $match $group $sort 和 $unwind
  • 请更新您的问题并发布您尝试的实际代码以及输出错误是什么
  • 我已按问题更新

标签: node.js mongodb mongoose


【解决方案1】:

乔林,

试试这个:

db.comments.aggregate(
[
  {$match: {blog_id: ObjectId("56587befdb7224110f007233")}}, //match blogid
  {"$unwind": "$comments"}, //unwind the comments array
  {$sort: {"comments.dt": 1}}, //sort the comment documents by date
  {
    "$group": {
        "_id": '$blog_id', //group comment documents by blog_id
        "comments": {
            "$push": "$comments" //push comments of same blog_id into an array
        }
    }
}])

根据您的示例数据,输出将是:

{
    "_id" : ObjectId("56587befdb7224110f007233"),
    "comments" : [
        {
            "user_id" : ObjectId("562fa014888806820e21e0df"),
            "user_full_name" : "Niroj Paudel",
            "comment" : "wat a nice car wow",
            "_id" : ObjectId("565efa37635f09900d21a33a"),
            "dt" : ISODate("2015-12-02T14:03:35.289Z")
        },
        {
            "user_id" : ObjectId("562fa014888806820e21e0df"),
            "user_full_name" : "Niroj Paudel",
            "comment" : "love is life budikhola ma dives",
            "_id" : ObjectId("565efa76635f09900d21a33b"),
            "dt" : ISODate("2015-12-02T14:04:38.661Z")
        },
        {
            "user_id" : ObjectId("562fa014888806820e21e0df"),
            "user_full_name" : "Niroj Paudel",
            "comment" : "bholi ajaya ko bihe",
            "_id" : ObjectId("565efaa0635f09900d21a33c"),
            "dt" : ISODate("2015-12-02T14:05:20.847Z")
        },
        {
            "user_id" : ObjectId("562fa014888806820e21e0df"),
            "user_full_name" : "Niroj Paudel",
            "comment" : "manish is nice",
            "_id" : ObjectId("565efb17635f09900d21a33d"),
            "dt" : ISODate("2015-12-02T14:07:19.704Z")
        },
        {
            "user_id" : ObjectId("562fa014888806820e21e0df"),
            "user_full_name" : "Niroj Paudel",
            "comment" : "niroj is cool",
            "_id" : ObjectId("565efd53c22dddc80e8f461c"),
            "dt" : ISODate("2015-12-02T14:16:51.730Z")
        },
        {
            "user_id" : ObjectId("562fa014888806820e21e0df"),
            "user_full_name" : "Niroj Paudel",
            "comment" : "ramesh is cool",
            "_id" : ObjectId("565f0d376d82e24c11f6c0d1"),
            "dt" : ISODate("2015-12-02T15:24:39.010Z")
        },
        {
            "user_id" : ObjectId("562fa014888806820e21e0df"),
            "user_full_name" : "Niroj Paudel",
            "comment" : "pradip is bhole baba",
            "_id" : ObjectId("565f0f5d77f0c7bd11bbadd9"),
            "dt" : ISODate("2015-12-02T15:33:49.578Z")
        },
        {
            "user_id" : ObjectId("562fa014888806820e21e0df"),
            "user_full_name" : "Niroj Paudel",
            "comment" : "honkog pokhara... he he ha ha",
            "_id" : ObjectId("565f1034fd07cbfc1129db0b"),
            "dt" : ISODate("2015-12-02T15:37:24.581Z")
        }
    ]
}

【讨论】:

  • 这将给出这样的结果 [ { "_id": "56587befdb7224110f007233" } ]
  • @Jorin 抱歉更新了我的答案。漏了一步。将所有 cmets 推入评论数组持有人。更新后的答案应该会给你想要的输出
  • 谢谢,它的工作。一个问题是可以将 cmets 数组限制为仅包含最后 5 个 cmets。
  • 分组前管道中的排序阶段之后?
  • 谢谢你 $limit , $skip all working....再次感谢。受到启发,我正在尝试实现页面存储桶,您能给我推荐一些可以帮助我的书籍或文章吗
【解决方案2】:

为此,您可以使用findById 方法,然后使用猫鼬的sort 方法对您的 cmets 进行排序。

举个例子:

Blog.find({blog_id : YOUR_BLOG_ID}, 'comments')
.sort('dt')
.exec(function(err, docs){
 console.log(docs); // do whatever you want with your docs
});

类似的东西应该可以完成这项工作。

【讨论】:

  • 这只会对单个文档进行排序。我希望对特定 blog_id 的多个文档中的 cmets 进行聚合和排序
猜你喜欢
  • 1970-01-01
  • 2020-06-30
  • 2018-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
相关资源
最近更新 更多