För det första, om du lagrar dina dokument som en array, varför lagrar du dem inte bara som en array? Om du kommer från en relationsdatabasbakgrund kan jag se hur du skulle bli frestad att lagra den på det sättet, men i Mongo, om det är som en array, bör den bara lagras som en array.
{
"_id" : ObjectId("52e5361f30f28b6b602e4c7f"),
"0" : "h",
"1" : "o",
"2" : "m"
}
Bör vara:
{
"_id" : ObjectId("52e5361f30f28b6b602e4c7f"),
"keys" : [ "h", "o", "m" ]
}
I det här fallet har Mongo en praktisk operator som heter $addToSet
som kommer att fungera precis som $push
förutom att den bara lägger till den i arrayen om den inte finns. Operationen skulle se ut ungefär så här:
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
EDIT:
Med uppdateringen kommer den att lägga till nyckeln till arrayen om den inte finns där, men om du BARA vill veta om den finns eller inte, tror jag att det bästa sättet skulle vara att använda 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();
}
För att behålla din inlaga som den är behöver du bara ändra Keys
till:
Keys = { 'keys' : [ 'key1', 'key2', 'key3' ] };
Och insatsen ska inte behöva ändras annars. I din samling kanske du också vill ändra _id
vara username
eller lägg till ett username
fältet till ditt dokument.