sql >> Databáze >  >> NoSQL >> MongoDB

Zkontrolujte, zda v kolekci mongo existuje hodnota

Za prvé, pokud ukládáte své dokumenty jako pole, proč je prostě neuložíte jako pole? Pokud pocházíte z prostředí relačních databází, chápu, jak byste byli v pokušení uložit to tímto způsobem, ale v Mongu, pokud je to jako pole, by mělo být uloženo jako pole.

{
    "_id" : ObjectId("52e5361f30f28b6b602e4c7f"),
    "0" : "h",
    "1" : "o",
    "2" : "m"
}

Mělo by být:

{
    "_id" : ObjectId("52e5361f30f28b6b602e4c7f"),
    "keys" : [ "h", "o", "m" ]
}

V tomto případě má Mongo praktický operátor s názvem $addToSet to bude fungovat stejně jako $push kromě toho, že jej přidá do pole pouze v případě, že neexistuje. Operace by vypadala nějak takto:

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:

S aktualizací přidá klíč do pole, pokud tam není, ale pokud chcete POUZE vědět, zda existuje nebo ne, myslím, že nejlepším způsobem by bylo použít 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();
}

Chcete-li zachovat přílohu tak, jak je, stačí změnit Keys komu:

Keys = { 'keys' : [ 'key1', 'key2', 'key3' ] };

A vložka by se jinak neměla měnit. Také ve své sbírce možná budete chtít změnit _id být username nebo přidejte username pole do vašeho dokumentu.




  1. Nastavení možnosti smallfiles pro řízení žurnálování neřídí velikost

  2. Jak nastavit zpětné volání načtení v mongoose v globální proměnné

  3. Reindexuje mongodb, pokud změníte pole, které se používá v indexu?

  4. MongoDb:Jak vložit další objekt do kolekce objektů v golangu?