2016-06-04 3 views
0

Dies ist Benutzer-Sammlung (pseudo):ist es möglich, Unterdokument mit Dokument mit bestimmten Feldern auf MongoDB beizutreten?

[ 
    { 
     _id: ..., 
     email: '[email protected]' 
     image: 'user1.png', 
     nickname: 'appleGuy', 
     createdAt: ..., 
     updatedAt: ... 
    }, 
    { 
     id: ..., 
     email: '[email protected]', 
     image: 'user2.png', 
     nickname: 'bananaGuy', 
     createdAt: ..., 
     updatedAt: ... 
    } 
] 

Sie die Felder sehen können: E-Mail, Bild, Spitznamen. Und das ist andere Sammlung für Adressbuchs implementieren:

[ 
    { 
     _id: ..., 
     email: '[email protected]', 
     list: [ 
      { 
       email: '[email protected]', 
       createdAt: ..., 
       updatedAt: ... 
      }, 
      { 
       email: '[email protected]', 
       createdAt: ..., 
       updatedAt: ... 
      } 
      { ... }, 
      { ... } 
     ] 
    } 
] 

Jedes Dokument von Adressbuchs hat E-Mail-Feld, dessen Adressbuchs zu unterscheiden ist, und Listenfeld jedes Element enthalten. wie Sie sehen können, ist addressbook.list Array, so dass es als Unterdokument aufrufen kann. Aber Unterdokument enthält nicht Spitzname und Bildfeld, also möchte ich ihnen beitreten. Ich denke, ich kann dies mit Aggregation Pipeline tun. Ich kann dies mit normalen Dokumenten tun, aber ich weiß nicht, wie dies mit dem Dokument auf dem Unterdokument geschieht. Auch Dokument der Benutzersammlung und addressbook.list, beide haben fieldAt und updatedAt (selbe Namen, verschiedene Daten), und ich möchte in addressbook.list projektieren. Wie soll ich es machen? Jeder Rat wird sehr zu schätzen wissen.

+1

Können Sie Ihre erwartete Ergebnisstruktur zeigen? – Shrabanee

+0

danke, titi23. Ich habe mit $ unwind und $ lookup, $ project gelöst! – modernator

+1

Wenn Sie dies gelöst haben - bitte posten Sie Ihre Lösung, um andere zu beleuchten oder Fragen zu löschen. – profesor79

Antwort

0

gelöst!

db.addressbook.aggregate([ 
    { 
     $match: { email } 
    }, 
    { 
     $unwind: '$list' 
    }, 
    { 
     $project: { 
      email: '$list.email' 
     } 
    }, 
    { 
     $lookup: { 
      from: 'user',   
      localField: 'email',  
      foreignField: 'email', 
      as: 'embedded' 
     } 
    }, 
    { 
     $unwind: '$embedded' 
    }, 
    { 
     $project: { 
      email: '$email', 
      nickname: '$embedded.nickname', 
      image: '$embedded.image' 
     } 
    } 
]); 

Ergebnis:

{ 
    "_id" : ObjectId("..."), 
    "email" : "[email protected]", 
    "nickname" : "user2", 
    "image" : "default" 
} 
{ 
    "_id" : ObjectId("..."), 
    "email" : "[email protected]", 
    "nickname" : "user3", 
    "image" : "default" 
}  
Verwandte Themen