MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Mongodb upsert вграден документ

Мисля, че това, което искате, е командата $addToSet - която ще избута елемент към масив само ако той вече не съществува. Малко опростих вашия пример за краткост:

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

Сега стартирайте:

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

И получаваме актуализираната версия:

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

Изпълнете отново същата команда и резултатът остава непроменен.

Забележка:вероятно ще увеличите тези документи, особено ако това поле е неограничено и причинява чести (сравнително скъпи) премествания чрез актуализиране по този начин - трябва да погледнете тук за идеи как да смекчите това:

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




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Стъпки за свързване на MongoDB и Solr с помощта на DataImportHandler

  2. Пушнете елемент във всяка позиция на масива в поддокумента

  3. Запитване на същия документ паралелно в същия API в mongoDB

  4. MongoDB:възможно ли е да се заснемат TTL събития с Change Stream, за да се емулира планировчик (cronjob)?

  5. mongodb:намиране на резюме на записите