MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Verifique se o valor existe na coleção do mongo


Primeiro, se você está armazenando seus documentos como um array, por que você não os armazena apenas como um array? Se você vem de um banco de dados relacional, posso ver como você ficaria tentado a armazená-lo dessa maneira, mas no Mongo, se for como um array, ele deve ser armazenado apenas como um array.
{
    "_id" : ObjectId("52e5361f30f28b6b602e4c7f"),
    "0" : "h",
    "1" : "o",
    "2" : "m"
}

Deveria estar:
{
    "_id" : ObjectId("52e5361f30f28b6b602e4c7f"),
    "keys" : [ "h", "o", "m" ]
}

Nesse caso, o Mongo tem um operador prático chamado $addToSet que funcionará como $push exceto que ele só irá adicioná-lo ao array se ele não existir. A operação ficaria mais ou menos assim:
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:

Com a atualização, ele adicionará a chave ao array se não estiver lá, mas se você APENAS quiser saber se existe ou não, acho que a melhor maneira seria 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 manter sua inserção como está, você só precisa alterar as Keys para:
Keys = { 'keys' : [ 'key1', 'key2', 'key3' ] };

E a inserção não precisa ser alterada de outra forma. Além disso, em sua coleção, você pode querer alterar o _id para ser username ou adicione um username campo para o seu documento.