For det første, hvis du gemmer dine dokumenter som et array, hvorfor gemmer du dem så ikke som et array? Hvis du kommer fra en relationel databasebaggrund, kan jeg se, hvordan du ville blive fristet til at gemme det på den måde, men i Mongo, hvis det er som et array, skal det bare gemmes som et array.
{
"_id" : ObjectId("52e5361f30f28b6b602e4c7f"),
"0" : "h",
"1" : "o",
"2" : "m"
}
Skal være:
{
"_id" : ObjectId("52e5361f30f28b6b602e4c7f"),
"keys" : [ "h", "o", "m" ]
}
I dette tilfælde har Mongo en praktisk operator kaldet $addToSet
der vil fungere ligesom $push
bortset fra at det kun vil tilføje det til arrayet, hvis det ikke eksisterer. Operationen ville se sådan ud:
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 opdateringen vil den tilføje nøglen til arrayet, hvis den ikke er der, men hvis du KUN vil vide, om den eksisterer eller ej, tror jeg, at den bedste måde ville være at bruge 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();
}
For at beholde din indsats som den er, skal du bare ændre Keys
til:
Keys = { 'keys' : [ 'key1', 'key2', 'key3' ] };
Og indsatsen skulle ellers ikke skulle ændres. I din samling vil du måske også ændre _id
at være username
eller tilføj et username
felt til dit dokument.