Po pierwsze, jeśli przechowujesz dokumenty jak tablicę, dlaczego nie przechowujesz ich po prostu jako tablicę? Jeśli wywodzisz się z relacyjnych baz danych, widzę, że kusi Cię, aby przechowywać je w ten sposób, ale w Mongo, jeśli jest jak tablica, powinna być przechowywana po prostu jako tablica.
{
"_id" : ObjectId("52e5361f30f28b6b602e4c7f"),
"0" : "h",
"1" : "o",
"2" : "m"
}
Powinno być:
{
"_id" : ObjectId("52e5361f30f28b6b602e4c7f"),
"keys" : [ "h", "o", "m" ]
}
W tym przypadku Mongo ma przydatny operator o nazwie $addToSet
który będzie działał tak jak $push
z wyjątkiem tego, że doda go do tablicy tylko wtedy, gdy nie istnieje. Operacja wyglądałaby mniej więcej tak:
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
EDYCJA:
Wraz z aktualizacją doda klucz do tablicy, jeśli go tam nie ma, ale jeśli chcesz TYLKO wiedzieć, czy istnieje, czy nie, myślę, że najlepszym sposobem byłoby użycie findOne
:
// 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();
}
Aby zachować wstawkę bez zmian, wystarczy zmienić Keys
do:
Keys = { 'keys' : [ 'key1', 'key2', 'key3' ] };
W przeciwnym razie wkładka nie powinna być zmieniana. Ponadto w swojej kolekcji możesz chcieć zmienić _id
być username
lub dodaj username
pole do twojego dokumentu.