Първо, ако съхранявате документите си като масив, защо просто не ги съхранявате като масив? Ако идвате от фон на релационна база данни, разбирам как бихте се изкушили да я съхранявате по този начин, но в Mongo, ако е като масив, трябва просто да се съхранява като масив.
{
"_id" : ObjectId("52e5361f30f28b6b602e4c7f"),
"0" : "h",
"1" : "o",
"2" : "m"
}
Трябва да бъде:
{
"_id" : ObjectId("52e5361f30f28b6b602e4c7f"),
"keys" : [ "h", "o", "m" ]
}
В този случай Mongo има удобен оператор, наречен $addToSet
това ще работи точно като $push
освен че ще го добави към масива само ако не съществува. Операцията ще изглежда така:
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
РЕДАКТИРАНЕ:
С актуализацията ще добави ключа към масива, ако не е там, но ако САМО искате да знаете дали съществува или не, мисля, че най-добрият начин би бил да използвате 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();
}
За да запазите вашата вложка такава, каквато е, трябва просто да промените Keys
до:
Keys = { 'keys' : [ 'key1', 'key2', 'key3' ] };
И вложката не трябва да се променя иначе. Освен това във вашата колекция може да искате да промените _id
да бъде username
или добавете username
поле към вашия документ.