MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mongodb upsert document intégré

Je pense que ce que vous voulez, c'est la commande $addToSet - qui ne poussera un élément dans un tableau que s'il n'existe pas déjà. J'ai un peu simplifié votre exemple par souci de brièveté :

db.meters.findOne()
{
    "_id" : ObjectId("4f8e95a718bc9c7da1e6511a"),
    "config" : {
        "someparam" : 4.5
    },
    "data" : [
        {
            "Meter" : 123456789,
        }
    ],
    "key" : "20120418_123456789"
}

Exécutez maintenant :

db.meters.update({"key" : "20120418_123456789"}, {"$addToSet": {"data" : {"Meter" : 1234}}})

Et nous obtenons la version mise à jour :

db.meters.findOne()
{
    "_id" : ObjectId("4f8e95a718bc9c7da1e6511a"),
    "config" : {
        "someparam" : 4.5
    },
    "data" : [
        {
            "Meter" : 123456789,
        },
        {
            "Meter" : 1234
        }
    ],
    "key" : "20120418_123456789"
}

Exécutez à nouveau la même commande et le résultat est inchangé.

Remarque :vous allez probablement développer ces documents, en particulier si ce champ est illimité et provoque des déplacements fréquents (relativement coûteux) en mettant à jour de cette manière - vous devriez jeter un œil ici pour des idées sur la façon d'atténuer cela :

http://www.mongodb.org/display/DOCS/Padding +Factor#PaddingFactor-ManualPadding