2016-04-18 23 views
1

Ich bin neu in Mongo, und ich versuche, von einem find() Abfrage mit demselben Namen unter mehreren spezifischen Daten abzurufen:MongoDB: Suchen nur bestimmten Datensatz

mich Benutzer Let explain-> ist eine Sammlung mit folgendem Dokument:

"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 
    } 
] 

jetzt will ich Kontonummer und IFSC Code, wo virtuelle id "ranisingh @ xyz" holen ist.

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

aber in Folge ich alle drei accountsnumber und DAV-Code: ich in der Lage, einige gefilterten Daten mit dieser Abfrage zu erhalten. dies wie: -

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

so jetzt will ich nur eine Kontonummer und DAV-Code drucken, die "ranisingh @ xyz" beleongs.

Antwort

1

Sie $ Scheibe verwenden kann erstes Element aus einem Array zu erhalten:

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

aber Dokument, das Sie brauchen, um neu zu gestalten Aggregation wie folgt zu verwenden:

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

Keine Wirkung, dasselbe Ergebnis sir. @ profesor79 –

+0

@SunnyDhiman hi - thx für feedback - gerade festgestellt, dass es extra {} - jetzt behoben – profesor79

+0

@ profesor79 Ich glaube nicht, dass dies helfen wird - wir wollen nicht das erste Element in der Anordnung, wir wollen was auch immer Element stimmt mit der Abfragebedingung überein. –

-2

Sie den „Positions $ verwenden können operator ", damit es anstelle aller Unterdokumente im Array nur das passende Unterdokument zurückgibt. Versuchen Sie folgendes:

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

, dass Sie sollten Rückkehr nur die passende Teildokument, wie folgt aus:

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

Ref: https://docs.mongodb.org/manual/reference/operator/projection/positional/#proj.S

-Update in Antwort auf Kommentare: dies nicht funktioniert , weil diese Art von Abfrage auf nur eine Verwendung des Positionsoperators $ beschränkt ist. Ich empfehle stattdessen, die Aggregationspipeline zu verwenden.

+0

"errmsg": "Es kann nicht mehr als ein positionales Projekt pro Abfrage angegeben werden.", – profesor79

+0

Ah ja, das ist eine Einschränkung. Ich denke, Sie müssen möglicherweise die größere Leistung der Aggregationspipeline verwenden, um genau das zu erhalten, wonach Sie suchen. –

+0

gibt es keine Notwendigkeit für Aggregation - meine Abfrage ist ausreichend ;-) - pls versuchen Sie es – profesor79

Verwandte Themen