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.