sql >> Databasteknik >  >> NoSQL >> MongoDB

Kontrollera om det finns värde i mongo-samlingen

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.




  1. Hur man skriver följande mongo-uppslagsfråga i Yii2

  2. $match i $lookup-resultat

  3. Utför förening i mongoDB

  4. MongoDB projicerar dokumenten med ett antal större än 2