Ich benutze NodeJS, um Dokumente in MongoDB einzufügen. Mit collection.insert
kann ich ein Dokument wie in diesem Code in die Datenbank einfügen:
// ...
collection.insert(objectToInsert, function(err){
if (err) return;
// Object inserted successfully.
var objectId; // = ???
});
// ...
Wie kann ich den _id
des eingefügten Objekts erhalten?
Gibt es eine Möglichkeit, den _id
abzurufen, ohne dass das neueste Objekt _id
eingefügt wird?
Angenommen, in der gleichen Zeit greifen viele Leute auf die Datenbank zu. Ich kann nicht sicher sein, dass die letzte ID die ID des eingefügten Objekts ist.
Es gibt einen zweiten Parameter für den Rückruf für collection.insert
, der das eingefügte Dokument oder die eingefügten Dokumente zurückgibt, die _ids haben sollten.
Versuchen:
collection.insert(objectToInsert, function(err,docsInserted){
console.log(docsInserted);
});
und überprüfen Sie die Konsole, um zu sehen, was ich meine.
Ein kürzerer Weg als die Verwendung eines zweiten Parameters für den Rückruf von collection.insert
wäre objectToInsert._id
, der den _id
zurückgibt (innerhalb der Rückruffunktion, vorausgesetzt, es war eine erfolgreiche Operation).
Der Mongo-Treiber für NodeJS hängt das Feld _id
an die ursprüngliche Objektreferenz an, sodass Sie die eingefügte ID einfach mit dem Originalobjekt abrufen können:
collection.insert(objectToInsert, function(err){
if (err) return;
// Object inserted successfully.
var objectId = objectToInsert._id; // this will return the id of object inserted
});
Ich habe tatsächlich eine console.log () für den zweiten Parameter in der Rückruffunktion für insert gemacht. Abgesehen von dem eingefügten Objekt selbst werden tatsächlich viele Informationen zurückgegeben. Der folgende Code erklärt, wie Sie auf die ID zugreifen können.
collection.insert(objToInsert, function (err, result){
if(err)console.log(err);
else {
console.log(result["ops"][0]["_id"]);
// The above statement will output the id of the
// inserted object
}
});
Wie ktretyak sagte, ist die beste Methode, um die ID eines eingefügten Dokuments zu erhalten, die Verwendung der Eigenschaft insertId für das Ergebnisobjekt. In meinem Fall funktionierte result._id nicht, also musste ich folgendes verwenden:
db.collection("collection-name")
.insertOne(document)
.then(result => {
console.log(result.insertedId);
})
.catch(err => {
// handle error
});
Dasselbe gilt für Callbacks.
Mongo sendet das vollständige Dokument als Rückrufobjekt, sodass Sie es nur von dort aus erhalten können.
zum Beispiel
collection.save(function(err,room){
var newRoomId = room._id;
});
Jetzt können Sie die Methode insertOne und in result.insertedId von promise verwenden
@JSideris, Beispielcode zum Abrufen der insertId.
db.collection(COLLECTION).insertOne(data, (err, result) => {
if (err)
return err;
else
return result.insertedId;
});
wenn Sie "_id" verwenden möchten, verwenden Sie simpley
result.insertedId.toString()
// toString konvertiert von hex