2016-06-29 2 views
2

Ich versuche, die emailAddress Feld und die page_slug übereinstimmen. Derzeit verwende ich die folgenden, die nur die über Seite im modularSequence matches:Finden Sie das Ergebnis innerhalb von Array of Objects und E-Mail-Adresse Feld

db.getCollection('users').find({"modularSequence.page_slug": "about"}, {"modularSequence.$": 1 }) 

Dies funktioniert und kehrt:

{ 
    "_id" : ObjectId("5740c631742da6e83389abb4"), 
    "modularSequence" : [ 
     { 
      "page_id" : "1", 
      "sequence" : "m_1", 
      "category" : "headers", 
      "page_slug" : "about" 
     } 
    ] 
} 

Welche es die Hälfte, was ich will. Ich möchte auch das Feld emailAddress zurückgeben. Ich habe versucht, diese verwenden, aber es gibt alles und mehrere modularen Elemente:

db.getCollection('users').find({$and:[{"emailAddress": '[email protected]'}, {"modularSequence.page_slug": "about"}, {"modularSequence": {$elemMatch: {page_slug:'about'}}}]}) 

[ 
    { 
    "emailAddress": "[email protected]", 
    "modularSequence": [ 
     { 
     "page_slug": "about", 
     "category": "headers", 
     "sequence": "m_1", 
     "page_id": "1" 
     }, 
     { 
     "page_slug": "contact", 
     "category": "content", 
     "sequence": "m_4", 
     "page_id": "2" 
     } 
    ] 
    } 
] 

Wie passe ich sowohl das emailaddress Feld und die modularSequence.page_slug - nur zurückgeben ein Ergebnis, wenn sowohl die E-Mail-Adresse übereinstimmt und die page_slug?

Antwort

2

Ihr Array $and enthält auch Ihren Feldauswahlparameter. Aber Sie brauchen nicht $and zu verwenden hier ohnehin als mehrere Abfragebegriffe implizit standardmäßig verknüpft sind, so können Sie Ihre Abfrage vereinfachen:

db.users.find({"emailAddress": '[email protected]', "modularSequence.page_slug": "about"}, 
       {"emailAddress": 1, "modularSequence.$": 1}) 

Welches ist Ihre erste Abfrage ist, aber mit einem emailAddress Feld sowohl hinzugefügt die Abfrage- und Feldauswahlparameter.

Der erste Parameter von find ist die Abfrage (welche docs), und der zweite ist der Vorsprung (die Felder innerhalb dieser Dokumente), so dass deshalb diese Felder gibt es zweimal. Die $ in der Projektion repräsentiert das modularSequence Array-Element in der Abfrage übereinstimmen.

+0

Das ist perfekt, vielen Dank. Ein paar Fragen, nur um zu verstehen, was los ist, im Gegensatz zu nur C & P'in diesem. Ich vermute die "emailAddress": 1 gibt an, dass wir die emailAddress von der obersten Ebene und "modularSequence. $" Wollen: 1 - tut dasselbe, aber für $, um page_slug darzustellen. Die eine Sache, die ich nicht ganz verstehe, ist, warum wir emailAddress & modularSequence zweimal spezifizieren? – DennisTurn

+0

Der erste Parameter von ['find'] (https://docs.mongodb.com/manual/reference/method/db.collection.find/#db.collection.find) ist die Abfrage (welche Dokumente) und die Zweitens ist die Projektion (die Felder innerhalb dieser Dokumente), deshalb sind diese Felder doppelt vorhanden. Das '$' in der Projektion repräsentiert das Array-Element 'modularSequence', das in der Abfrage übereinstimmt. – JohnnyHK

+0

Perfekt, danke @JohnnyHK – DennisTurn

Verwandte Themen