MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Vérifier si la valeur existe dans la collection mongo

Tout d'abord, si vous stockez vos documents comme un tableau, pourquoi ne les stockez-vous pas simplement comme un tableau ? Si vous venez d'un milieu de base de données relationnelle, je peux voir comment vous seriez tenté de le stocker de cette façon, mais dans Mongo, si c'est comme un tableau, il devrait simplement être stocké sous forme de tableau.

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

Devrait être :

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

Dans ce cas, Mongo a un opérateur pratique appelé $addToSet cela fonctionnera comme $push sauf qu'il ne l'ajoutera au tableau que s'il n'existe pas. L'opération ressemblerait à ceci :

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

MODIFIER :

Avec la mise à jour, il ajoutera la clé au tableau si elle n'y est pas, mais si vous voulez UNIQUEMENT savoir si elle existe ou non, je pense que la meilleure façon serait d'utiliser 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();
}

Pour conserver votre insert tel quel, il vous suffirait de changer les Keys à :

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

Et l'insert ne devrait pas avoir besoin de changer sinon. De plus, dans votre collection, vous voudrez peut-être modifier le _id être username ou ajoutez un username champ à votre document.