Zunächst einmal, wenn Sie Ihre Dokumente wie ein Array speichern, warum speichern Sie sie nicht einfach als Array? Wenn Sie von einem relationalen Datenbankhintergrund kommen, kann ich sehen, wie Sie versucht wären, es auf diese Weise zu speichern, aber in Mongo, wenn es wie ein Array ist, sollte es nur als Array gespeichert werden.
{
"_id" : ObjectId("52e5361f30f28b6b602e4c7f"),
"0" : "h",
"1" : "o",
"2" : "m"
}
Sollte lauten:
{
"_id" : ObjectId("52e5361f30f28b6b602e4c7f"),
"keys" : [ "h", "o", "m" ]
}
In diesem Fall hat Mongo einen praktischen Operator namens $addToSet
das funktioniert genauso wie $push
außer dass es nur dann zum Array hinzugefügt wird, wenn es nicht existiert. Die Operation würde in etwa so aussehen:
collection.update( query, { $addToSet : { 'keys' : 'l' }}, callback );
// add key 'l'
collection.update( query, { $addToSet : { 'keys' : 'm' }}, callback );
// looks in document, sees 'm' in array, and does nothing
BEARBEITEN:
Mit dem Update wird der Schlüssel zum Array hinzugefügt, wenn er nicht vorhanden ist, aber wenn Sie NUR wissen möchten, ob er existiert oder nicht, denke ich, dass der beste Weg darin besteht, findOne
zu verwenden :
// find the doc by _id and the value you want in keys, returns null if it's not a match
collection.findOne({ _id : 52e5361f30f28b6b602e4c7f, 'keys' : 'l' }, function(err, doc) {
if( doc == null ) {
// do whatever you need to do if it's not there
} else {
// do whatever you need to if it is there
}
db.close();
}
Um Ihre Beilage unverändert zu lassen, müssen Sie nur Keys
ändern zu:
Keys = { 'keys' : [ 'key1', 'key2', 'key3' ] };
Und der Einsatz sollte sonst nicht geändert werden müssen. Außerdem möchten Sie in Ihrer Sammlung möglicherweise die _id
ändern username
sein oder fügen Sie einen username
hinzu Feld in Ihr Dokument.