Nie mongodb
ekspert, ale jeśli dobrze rozumiem, chcesz, aby pole _id poddokumentu było wstawiane automatycznie.
Utworzyłem threads
db, a następnie wstawił pierwszą message
w messages
zbieranie za pomocą następującego polecenia:
db.messages.insert({messages:[{_id:ObjectId(), message:"Message 1."}]});
Zwróć uwagę na _id:ObjectId()
pole. Wynik jest następujący:
Teraz, gdy mam ObjectId(56...)
, mogę zaktualizować ten konkretny rekord i wstawić do niego więcej wiadomości. A komenda wygląda następująco:
db.messages.update({"_id":ObjectId("56...")},
{$push:{messages:{_id:ObjectId(), message:"I am message 2."}}});
A powyższe wstawiłoby nową wiadomość do kolekcji. Zobacz poniższe zrzuty ekranu:
i wreszcie po kilku aktualizacjach kolekcja wygląda następująco:
Wszystkie pola _id w messages
tablica jest generowana automatycznie.
Używanie _id
może nie być dobrym pomysłem pola z różnych powodów. Prosimy o Google, aby uzyskać więcej informacji na temat tego, czy używać _id jako klucza dla poddokumentów, czy nie.
Użyłem MongoDB wersji 3.0.6 powłoki dla poleceń.
EDYTUJ 28-01-2016 16:09
Ponieważ powyższe rozwiązanie bazowało na powłoce MongoDB, postanowiłem przeprowadzić kolejny test przy użyciu sterownika Node.js dla MongoDB. Przede wszystkim deklaruję zmienną ObjectID w następujący sposób
var ObjectID = require('mongodb').ObjectID;
Użyję ObjectID z identyfikatorem dokumentu wątku, do którego należy wstawić wiadomość, jak następuje w mojej update
i findOneAndUpdate
wywołania funkcji
app.get('/insertNewMessage', function(req, res) {
db.collection("messages").findOneAndUpdate({
_id: new ObjectID('56aa3554e90911b64c36a424')
}, {
$push: {
messages: {
_id: new ObjectID(),
message: "From NodeJS with <3 using findOneAndUpdate.Bye."
}
}
}, function(err, result) {
if (err)
res.json(err);
else
res.json(result);
});
});
Przetestowałem oba i działa dobrze. Zobacz zrzut ekranu poniżej: