En primer lugar, si está almacenando sus documentos como una matriz, ¿por qué no los almacena simplemente como una matriz? Si proviene de una base de datos relacional, puedo ver cómo se sentiría tentado a almacenarlo de esa manera, pero en Mongo, si es como una matriz, solo debe almacenarse como una matriz.
{
"_id" : ObjectId("52e5361f30f28b6b602e4c7f"),
"0" : "h",
"1" : "o",
"2" : "m"
}
Debería ser:
{
"_id" : ObjectId("52e5361f30f28b6b602e4c7f"),
"keys" : [ "h", "o", "m" ]
}
En este caso, Mongo tiene un práctico operador llamado $addToSet
eso funcionará como $push
excepto que solo lo agregará a la matriz si no existe. La operación se vería así:
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
EDITAR:
Con la actualización, agregará la clave a la matriz si no está allí, pero si SOLO desea saber si existe o no, creo que la mejor manera sería usar 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();
}
Para mantener su inserción como está, solo necesitaría cambiar Keys
a:
Keys = { 'keys' : [ 'key1', 'key2', 'key3' ] };
Y el inserto no debería necesitar cambiar de otra manera. Además, en su colección, es posible que desee cambiar el _id
ser username
o agrega un username
campo a su documento.