sql >> Base de Datos >  >> NoSQL >> MongoDB

Compruebe si existe valor en la colección mongo

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.