2016-04-18 13 views
1

私はモンゴに新たなんだ、と私は見つける()クエリから同じ名前を持つ複数のうち特定のデータを取得しようとしているの取得:私explain-> ユーザーをしてみましょうのMongoDB:特定のレコードのみ

するコレクションです

"linkedaccounts": [ 
    { 
    "accountname": "Rani Charan", 
    "accountnumber": "10815748690065", 
    "ifsc": "UTIB0001081", 
    "virtualid": "[email protected]", 
    "_id": "571488b9720023940539959e", 
    "isDefaultReceiving": false, 
    "isDefaultFunding": false, 
    "isAppEnabled": false, 
    "aeba": false, 
    "accountsource": 0 
    }, 
    { 
    "accountname": "Rani Singh", 
    "accountnumber": "01316366360080", 
    "virtualid": "[email protected]", 
    "_id": "571488b972002394053995a0", 
    "ifsc": "UTIB0000131", 
    "isDefaultReceiving": false, 
    "isDefaultFunding": true, 
    "isAppEnabled": true, 
    "aeba": false, 
    "accountsource": 0 
    }, 
    { 
    "accountname": "Rani K Singh", 
    "accountnumber": "07916956560873", 
    "virtualid": "[email protected]", 
    "_id": "571488b9720023940539959f", 
    "ifsc": "UTIB0000791", 
    "isDefaultReceiving": true, 
    "isDefaultFunding": false, 
    "isAppEnabled": true, 
    "aeba": false, 
    "accountsource": 0 
    } 
] 

ここで、仮想IDが "ranisingh @ xyz"のアカウント番号とifscコードを取得します。

db.users.find(
     {"linkedaccounts.virtualid": "[email protected]"}, 
     {_id: 0, 'linkedaccounts.accountnumber': 1,'linkedaccounts.ifsc': 1}) 

しかし、私は3つのアカウント番号とifscコードをすべて取得しました。このように: -

{ 
    "linkedaccounts" : [ 
      { 
        "accountnumber" : "10815748690065", 
        "ifsc" : "UTIB0001081" 
      }, 
      { 
        "accountnumber" : "01316366360080", 
        "ifsc" : "UTIB0000131" 
      }, 
      { 
        "accountnumber" : "07916956560873", 
        "ifsc" : "UTIB0000791" 
      } 
    ]} 

だから今は "ranisingh @ xyzのを" beleongs一つだけACCOUNTNUMBERとIFSCコードを印刷したいです。

答えて

1

あなたは配列の最初の要素を取得するために$スライスを使用することができます。

db.users.find(
    {"linkedaccounts.virtualid": "[email protected]"} , 
    { 
    _id: 0,  
    linkedaccounts: {$elemMatch: {virtualid:"[email protected]"}} 
    } 
); 

いますが、このように凝集を使用する必要がある文書を再構築するために:

db.users.aggregate([ 
    {$unwind:"$linkedaccounts"}, 
    {$match:{"linkedaccounts.virtualid":"[email protected]"}}, 
    {$project:{ 
     _id:0, 
     linkedaccounts: 
      {accountnumber:"$linkedaccounts.accountnumber", 
         ifsc:"$linkedaccounts.ifsc"}  
     }} 
    ]) 
+0

影響なし、同じ結果先生。 @ profesor79 –

+0

フィードバックのための@SunnyDhiman hi - thx - 余分な{} - 固定されていることが分かりました – profesor79

+0

@ profesor79これは役に立ちそうです - 私たちは配列の最初の項目を望んでいません、クエリ条件に一致します。 –

-2

あなたが「位置$を使用することができます配列内のすべてのサブ文書ではなく、一致するサブ文書のみを返すようにします。

{ 
    _id: ObjectId("564b16849408a50b00ec235e"), 
    "linkedaccounts" : [ 
    { 
     "accountnumber" : "07916956560873", 
     "ifsc" : "UTIB0000791" 
    } 
    ] 
} 

は参考:コメントへの返信でhttps://docs.mongodb.org/manual/reference/operator/projection/positional/#proj.S

更新:これは動作しません。このように、あなただけのマッチングサブ文書を返すべき

db.users.find(
    {"linkedaccounts.virtualid": "[email protected]"} , 
    { 
    _id: 0, 
    'linkedaccounts.$.accountnumber': 1, 
    'linkedaccounts.$.ifsc': 1 
    } 
); 

:これを試してみてくださいこのタイプのクエリは、位置$演算子の1回の使用に限定されているためです。代わりに集約パイプラインを使用することをお勧めします。

+0

"errmsg": "クエリごとに複数の位置プロジェクタを指定することはできません。"、 – profesor79

+0

ああ、それは制限です。私はあなたが後にしているものを正確に得るために集約パイプラインのより大きな力を使う必要があるかもしれないと思います。 –

+0

集約のための必要はありません - 私のクエリが;-)十分です - plsはそれ – profesor79

関連する問題