2016-05-02 8 views
0

私は以下の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" : [ ] 
} 

PostCommentsサブフィールドをIDフィールドで取得する方法。

私は次のクエリ試してみました:

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" : "" 
    } 
}, 
+1

上記のクエリで期待されている出力を投稿することはできますか? –

+0

私は質問から空の配列を取得しています。私は質問を更新し、期待される結果を追加しました。見てください。 – Chinmay

答えて

0

あなたが内部"PostComments.ID"フィルタを追加しているので、あなたが投稿したクエリは、任意のドキュメントを書いていません$elemMatch投影。それはちょうど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" 
} 
関連する問題