MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Controlla se esiste un valore nella collezione mongo

Prima di tutto, se stai archiviando i tuoi documenti come un array, perché non li memorizzi semplicemente come un array? Se provieni da un database relazionale, posso vedere come saresti tentato di archiviarlo in quel modo, ma in Mongo, se è come un array, dovrebbe essere archiviato come un array.

{
    "_id" : ObjectId("52e5361f30f28b6b602e4c7f"),
    "0" : "h",
    "1" : "o",
    "2" : "m"
}

Dovrebbe essere:

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

In questo caso, Mongo ha un pratico operatore chiamato $addToSet funzionerà proprio come $push tranne per il fatto che lo aggiungerà all'array solo se non esiste. L'operazione sarebbe simile a questa:

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

MODIFICA:

Con l'aggiornamento, aggiungerà la chiave all'array se non è presente, ma se vuoi SOLO sapere se esiste o meno, penso che il modo migliore sarebbe usare 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();
}

Per mantenere il tuo inserto così com'è, devi solo cambiare Keys a:

Keys = { 'keys' : [ 'key1', 'key2', 'key3' ] };

E l'inserto non dovrebbe aver bisogno di cambiare altrimenti. Inoltre, nella tua raccolta, potresti voler cambiare il _id essere username oppure aggiungi un username campo al tuo documento.