mongoDB : Erzeugen Einer ObjectId Für Jedes Neue Kind Hinzugefügt, Um Das Array-Feld
mongodb 2.1.4(Die Knoten-Treiber)
Ich versuche momentan zum erstellen einer neuen ObjectID für jede Nachricht, die ich einfügen in ein array(der array wird ein Filialdokument).
Ich Abbildung diese Art und Weise Alle CRUD-Operationen können leicht durchgeführt werden, auf jede Nachricht im array.
Zum Beispiel:
Die "threads" - collection(Hinweis - Eine ObjectId für jede Nachricht)
{
"_id": ObjectId("1234132413424123"), //A thread id
messages:[
{
_id :ObjectId("134124412341234"),//A message id
"message":"MongoDB is my friend"
},
{
_id :ObjectId("534124412342377"),
"message":"MongoDB is my friend too"
},
...
]
},
{
"_id": ObjectId("22341324134224234"),
messages:[
{
_id :ObjectId("8341244123411235"),
"message":"Something clever"
},
{
_id :ObjectId("134124412342376"),
"message":"blah blah blah"
},
...
]
}
Was ich gerade jetzt tun:
var query = {};
query["_id"] = new ObjectID(threadID);
var update = {$push: {}}; //I write the update object externally just for aesthetics
update.$push["messages"] = newMessage;
var threadsCollection = db.collection('threads');
threadsCollection.findOneAndUpdate(query,update, function (err, result) {
if (err) {
console.log(err);
}
db.close();
});
Problem:
Im Gegensatz zu "insert" für Sammlungen, ein update mit $push nicht erstellen
neue ObjectId für jede Nachricht, die dem array Hinzugefügt.
Frage:
Gibt es einen standard-Weg der Schaffung einer ObjectID während eine $push in
das child-array? Oder sollten wir Sie einfach erstellen Sie manuell eine ObjectID und fügen Sie es dem Kind vorher?
- Überprüfen Sie heraus ein besserer Ansatz baeldung.com/spring-boot-mongodb-auto-generated-field. Sie können Benutzer-Sequenz-generator für untergeordnete Objekte sowie
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht
mongodb
Experte, aber, wenn ich Sie richtig verstehe, wollen Sie das _id Feld der das Filialdokument eingefügt werden, automatisch.Ich erstellt
threads
db und dann eingefügt, das erstemessage
immessages
Sammlung mit dem folgenden Befehl:Beachten Sie die
_id:ObjectId()
Feld. Das Ergebnis ist wie folgt:Nun, dass ich ein
ObjectId(56...)
kann ich aktualisieren, die bestimmten Datensatz, und fügen Sie mehr Nachrichten. Und der Befehl ist wie folgt:Und das würde nicht legen Sie die neue Nachricht in der Sammlung. Siehe unten screenshots:
und schließlich nach ein paar updates die Sammlung wie folgt aus:
Alle _id Felder in der
messages
array werden automatisch generiert.Es ist vielleicht nicht eine gute Idee zu verwenden
_id
Felder aus verschiedenen Gründen. Bitte Google für weitere Einzelheiten auf, ob _id als Schlüssel für Filialdokumente oder nicht.Ich verwendet MongoDB shell version 3.0.6 für die Befehle.
BEARBEITEN 28-01-2016 16:09
Da die obige Lösung basiert auf MongoDB shell, habe ich beschlossen, einen weiteren test mit Node.js Treiber für MongoDB. Zunächst erkläre ich ObjectID variable wie folgt
Verwende ich die ObjectID mit der Dokument-id des thread, der die Nachricht eingefügt werden soll, wie folgt in meinem
update
undfindOneAndUpdate
FunktionsaufrufeBeide getestet und funktioniert Prima. Siehe screenshot unten:
newMessage["_id"] = new ObjectID();
und dann aktualisieren Sie die Sammlung wie diesethreadCollection.findOneAndUpdate(query,{$push:{messages:newMessage}}});
Sorry für den Bruch des Protokolls, aber ich weiß nicht genug rep, Kommentar zu den Haupt-thread.
Schaue ich, wie das generieren eines
JSON
einfügen mitObjectID()
und auf meinen Reisen gefunden habe, dass diese Lösung nicht sehr gut für die Indizierung. Die vorgeschlagene Lösung hat _id Werte sind strings eher als reales Objekt-IDs, d.h."56a970405ba22d16a8d9c30e" unterscheidet sich von
ObjectId("56a970405ba22d16a8d9c30e")
und die Indizierung langsamer mit dem string. DieObjectId
ist tatsächlich vertreten werden intern als 16bytes
.