【问题标题】:Get only subdocument array by field按字段仅获取子文档数组
【发布时间】:2016-08-26 18:46:08
【问题描述】:

我有以下ServiceProvider 收藏。

{
    "_id" : ObjectId("5724a838588aeca6158b4567"),
    "ServiceProviderID" : 3,
    "Title" : "test1",
    "PostedMessage" : "test1",
    "TotalComments" : 0,
    "TotalShares" : 0,
    "TotalThanks" : 0,
    "AddedOn" : "2016-04-30",
    "LastModifiedOn" : "2016-04-30 12:42:32",
    "PostAttachment" : {
        "ImagePath" : ""
    },
    "PostCommentUserIDs" : [
        "3"
    ],
    "PostComments" : [
        { // Only want this array to return
            "ID" : "1462020155845421948",
            "UserID" : 3,
            "CommentMessage" : "1",
            "TotalThanks" : 0,
            "AddedOn" : "2016-04-30 12:42:35",
            "LastModifiedOn" : "2016-04-30 12:42:35",
            "CommentAttachment" : {
                "ImagePath" : ""
            }
        },
        {
            "ID" : "14620201551142120893",
            "UserID" : 3,
            "CommentMessage" : "2",
            "TotalThanks" : 0,
            "AddedOn" : "2016-04-30 12:42:35",
            "LastModifiedOn" : "2016-04-30 12:42:35",
            "CommentAttachment" : {
                "ImagePath" : ""
            }
        },
        {
            "ID" : "14620201561666853653",
            "UserID" : 3,
            "CommentMessage" : "3",
            "TotalThanks" : 0,
            "AddedOn" : "2016-04-30 12:42:36",
            "LastModifiedOn" : "2016-04-30 12:42:36",
            "CommentAttachment" : {
                "ImagePath" : ""
            }
        }
    ],
    "Subscriber" : [ ]
}

如何通过 ID 字段仅获取 PostComments 子文档数组。

我尝试了以下查询:

db.ServiceProvider.find({
    "_id" : ObjectId('5724a838588aeca6158b4567'),
    "PostComments.ID":"1462020155845421948"
},{
    "_id": 0,
    "PostComments" :{
       "$elemMatch":{
           "PostComments.ID" : "1462020155845421948"
       } 
    }
}) 

但它不起作用。任何人都可以请帮忙。谢谢!

编辑:

我只想返回以下 PostComments 子文档数组:

{ 
     "ID" : "1462020155845421948",
     "UserID" : 3,
     "CommentMessage" : "1",
     "TotalThanks" : 0,
     "AddedOn" : "2016-04-30 12:42:35",
     "LastModifiedOn" : "2016-04-30 12:42:35",
     "CommentAttachment" : {
          "ImagePath" : ""
     }
},

【问题讨论】:

  • 您能否发布预期的输出与您通过上述查询得到的结果?
  • 我从查询中得到空数组。我已经更新了问题并添加了预期的结果。请看一看。

标签: mongodb subdocument


【解决方案1】:

您发布的查询没有写入任何文档,因为您在$elemMatch 投影中添加了"PostComments.ID" 过滤器。它应该只是 ID。

db.ServiceProvider.find({
    "_id" : ObjectId('5724a838588aeca6158b4567'),
    "PostComments.ID":"1462020155845421948"
},{
    "_id": 0,
    "PostComments" :{
       "$elemMatch":{
           "ID" : "1462020155845421948"
       } 
    }
}) 

您可以使用下面的聚合函数来重新塑造数组元素以在第一级获得它(以获得预期的结果)。

db.ServiceProvider.aggregate([
    {$match : {"_id" : ObjectId('5724a838588aeca6158b4567')}},
    {$unwind : "$PostComments"},
    {$match : {"PostComments.ID":"1462020155845421948"}},
    {$project : { "_id" : 0, "ID" : "$PostComments.ID", "UserID" : "$PostComments.UserID", "CommentMessage" : "$PostComments.CommentMessage","TotalThanks" : "$PostComments.TotalThanks","CommentAttachment" : "$CommentAttachment.UserID",}}
])

这个聚合函数将打印在结果下方。

{  
   "TotalThanks":0,
   "ID":"1462020155845421948",
   "UserID":3,
   "CommentMessage":"1"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多