2011-09-26 95 views
5

私は私のコレクションのレコードを持っていると私は、ID 1である人物の詳細を取得したいが、私はその後mongodbで一致するレコードを見つける方法は?

> db.mycollection.findOne({"person.id":1},{"person.details":1,"_id":0}) 
を実行する代わりに、1

db.mycollection.insert({"person" : [ { "id":1, "details" : { "name" : "Aswini", "Age" : 10 }}, { "id":2, "details" : { "name" : "Mahesh", "Age" : 11}}]}) 

の2timesの詳細を取得しています

結果は次のとおりです。

{ 
     "person" : 
       [ 
        { 
         "details" : 
         { 
         "name" : "Aswini", 
         "Age" : 10 
         } 
        }, 
        { 
         "details" : 
         { 
         "name" : "Mahesh", 
         "Age" : 11 
         } 
        } 
       ] 
    } 

しかし、次のように、私は必要があります。

{ 
    "person" : [ 
       { 
       "details" : { 
          "name" : "Aswini", 
          "Age" : 10 
         } 
       } 
      ] 
    } 

ここでは間違いを理解していません。あなたの助けが必要です。 MongoDB、Javaを使用しています

答えて

0

personは配列です。あなたはこの配列の最初の要素を取得したい場合は、$slice

db.mycollection.findOne({"person.id":1},{"person":{$slice:[0,1]},"_id":0}) 
+0

その間違っているようなものがあります。 opは第1要素を必要としないので、位置にかかわらず一致するサブ配列を検索したい。 person.idサブdocがクエリの上の最後の位置にある場合は、woekになりません – RameshVel

+0

あなたは絶対に正しいです。インデックスに関係なくサブ配列が必要です。あなたがmongodbへの新生児である解決策があれば助けてください – aswininayak

3

を使用する必要があります。これは、マルチレベル埋め込まれた文書をフィルタリングする動作であり、通常のマッチングフィルタはドキュメント全体ではなく、サブセットを返します。

通常のサブ文書に一致するのに、positional operator $が使用されます。しかし、この機能はリターン指定子ではまだ実装されていません。

mongo Support for positional ($) operator in fields to return specifierには未解決の問題があります。ですから、これを処理するために、あなたのスキーマをredesginする必要が

を(あなたが本当に機能が必要な場合に投票するには、ログインしてください)、この

db.test.insert({"person" : [ { "id":1, "details" : { "name" : "Aswini", "Age" : 10 }}]}) 
db.test.insert({"person" : [ { "id":2, "details" : { "name" : "Mahesh", "Age" : 11}}]}) 

db.test.find({"person.id":1},{'person.details':1}) 
関連する問題