根据数组字段的子文档_id查找父文档id

Posted

技术标签:

【中文标题】根据数组字段的子文档_id查找父文档id【英文标题】:finding the parent document id based on the sub document _id of array field 【发布时间】:2016-03-12 11:10:04 【问题描述】:

Hyy,我有一个集合,其中与博客相关的 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

]

假设用户想要更新他的评论;为此,我将拥有 cmets _id 现在我的问题是如何根据 cmets 数组字段的评论 _id 值检测评论存在于哪个文档中。

假设我有一条评论“_id”:“565f0f5d77f0c7bd11bbadd9”(第一个文档的第一个元素) 那么结果应该给出父文档_id:“565f0f5d77f0c7bd11bbadd8”(第一个文档id)

我该怎么做..

提前谢谢你

【问题讨论】:

【参考方案1】:

如果可能,请更新您的架构。 假设您有博客集合。那么你的代码将是:

Blog.find('comments._id' : '565f0f5d77f0c7bd11bbadd9').exec(function(err,blog)
    if(!err && blog)
        console.log("Blog id :"+blog._id);
    
    else
        console.log("Dont get your blog");
    
);

【讨论】:

此查询仅在 cmets 位于单个文档中时才有效......实际上这是一个类似于我原来的问题的虚拟问题......【参考方案2】:

如果您的 cmets 直接存储在博客文档中,您可以使用聚合方法收集所有文档中的评论。 请注意,当您没有要填充的任何对象引用时,这似乎有效。

假设所有文档都基于博客架构,并且您希望收到评论的 id:

Blog.aggregate(
['$match':'comments':'$elemMatch:'_id':'565f0f5d77f0c7bd11bbadd9',

'$project':comments:'$_id', user_id:1,
'$unwind':'$comments'
'$group':_id:'$comments'
]).exec(function(err, results)
    if(results)
       console.log(results);
    
);

我希望这有点像您正在寻找的东西,您可能会发现以下内容很有用 elementMatch 和 aggregation 来自 mongoDB 文档。

干杯!

【讨论】:

以上是关于根据数组字段的子文档_id查找父文档id的主要内容,如果未能解决你的问题,请参考以下文章

在文档数组中查找包含字段的子文档

如何匹配 MongoDB 中的子文档数组?

如何根据MongoDB中文档字段中的每个数组项过滤集合

如何修改数组中特定子文档中的字段?

如何根据查询从子文档数组中更新子文档字段?

根据文档中数组元素的值和文档本身的_id更新文档