MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB bevorzugtes Schema für eingebettete Sammlungen. Dokumente vs. Arrays

Bei Ihrem ersten Ansatz können Sie die ID-Felder nicht indizieren, da die ID als Schlüssel verwendet wird. Es ist eine Art Schlüssel-Wert-Wörterbuch. Dieser Ansatz ist nützlich, wenn Sie den bekannten Satz von IDs haben (natürlich weniger Anzahl). Nehmen Sie an, dass in Ihrem ersten Beispiel die ID vorne bekannt ist ,

>>db.your_colleection.find()
 { "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "name" : "bill", 
  "lines" : { 
             "idk73716" : { "name" : "Line A" },
             "idk51232" : { "name" : "Line B" } ,
             "idk23321":  { "name" : "Line C" }
            } 
  }

Um also die Werte für das ID-Feld idk73716 zu finden, können Sie dies tun, indem Sie

 db.your_colleection.find({},{'lines.idk73716':1})
 { "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "lines" : { "idk73716" : { "name" : "Line A" } } }

das leere {} bezeichnet die Abfrage und der zweite Teil {'lines.idk73716':1} ist ein Abfrageselektor.

Ids als Schlüssel zu haben, hat den Vorteil, dass nur das jeweilige Feld ausgewählt werden kann. Obwohl {'lines.idk73716':1} ein Feldselektor ist, dient er hier als Abfrage und Selektor. aber dies kann in Ihrem zweiten Ansatz nicht getan werden. Angenommen, die zweite Sammlung sieht ungefähr so ​​aus

> db.second_collection.find()
{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "name" : "bill", "lines" : [
    {
        "id" : "idk73716",
        "name" : "Line A"
    },
    {
        "id" : "idk51232",
        "name" : "Line B"
    },
    {
        "id" : "idk23321",
        "name" : "Line C"
    }
] }
> 

Und Sie haben die Feld-ID indiziert, also wenn Sie nach ID fragen möchten

> db.second_collection.find({'lines.id' : 'idk73716' })

{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "name" : "bill", "lines" : [
    {
        "id" : "idk73716",
        "name" : "Line A"
    },
    {
        "id" : "idk51232",
        "name" : "Line B"
    },
    {
        "id" : "idk23321",
        "name" : "Line C"
    }
] }
> 

Wenn Sie die obige Ausgabe sehen, ist es sichtbar, dass es keine Möglichkeit gibt, die übereinstimmenden untergeordneten (eingebetteten) Dokumente allein auszuwählen, aber es ist im ersten Ansatz möglich. Dies ist das Standardverhalten von mongodb.

siehe

db.second_collection.find({'lines.id' : 'idk73716' },{'lines':1})

holt alle Zeilen, nicht nur idk73716

{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "lines" : [
    {
        "id" : "idk73716",
        "name" : "Line A"
    },
    {
        "id" : "idk51232",
        "name" : "Line B"
    },
    {
        "id" : "idk23321",
        "name" : "Line C"
    }
] }

Hoffe das hilft

BEARBEITEN

Danke an @Gates VP für den Hinweis

Wir können immer noch $exists verwenden, um die ID abzufragen, aber sie ist nicht indexierbar