Ten eerste, als u uw documenten als een array opslaat, waarom slaat u ze dan niet gewoon op als een array? Als je van een relationele database-achtergrond komt, kan ik zien hoe je in de verleiding zou komen om het op die manier op te slaan, maar in Mongo, als het als een array is, zou het gewoon als een array moeten worden opgeslagen.
{
"_id" : ObjectId("52e5361f30f28b6b602e4c7f"),
"0" : "h",
"1" : "o",
"2" : "m"
}
Zou moeten zijn:
{
"_id" : ObjectId("52e5361f30f28b6b602e4c7f"),
"keys" : [ "h", "o", "m" ]
}
In dit geval heeft Mongo een handige operator genaamd $addToSet
dat werkt net als $push
behalve dat het het alleen aan de array zal toevoegen als het niet bestaat. De operatie zou er ongeveer zo uitzien:
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
BEWERKEN:
Met de update zal het de sleutel aan de array toevoegen als het er niet is, maar als je ALLEEN wilt weten of het bestaat of niet, denk ik dat de beste manier zou zijn om findOne
te gebruiken :
// 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();
}
Om uw invoeging te behouden zoals deze is, hoeft u alleen maar Keys
. te wijzigen naar:
Keys = { 'keys' : [ 'key1', 'key2', 'key3' ] };
En de insert zou anders niet hoeven te veranderen. In uw verzameling wilt u misschien ook de _id
. wijzigen te zijn username
of voeg een username
toe veld toe aan uw document.