Существует ли путь к upsert список с единым запросом?

Я знаю, что этот вопрос задали прежде, но это - другой сценарий. Я хотел бы иметь набор как это:

{
    "_id" : ObjectId("4c28f62cbf8544c60506f11d"),
    "pk": 1,
    "forums": [{
        "pk": 1,
        "thread_count": 10, 
        "post_count": 20,
    }, {
        "pk": 2,
        "thread_count": 5, 
        "post_count": 24,
    }]
}

То, что я хочу сделать, является к upsert объектом "форума", увеличивая счетчики или добавляя объект, если он не существует.

Например, чтобы сделать что-то вроде этого (я надеюсь, что это имеет смысл):

db.mycollection.update({
    "pk": 3,
    "forums.pk": 2
}, {
    "$inc": {"forums.$.thread_count": 1},
    "$inc": {"forums.$.post_count": 1},
}, true)

и имейте:

{
    "_id" : ObjectId("4c28f62cbf8544c60506f11d"),
    "pk": 1,
    "forums": [{
        "pk": 1,
        "thread_count": 10, 
        "post_count": 20,
    }, {
        "pk": 2,
        "thread_count": 5, 
        "post_count": 24,
    }]
},
{
    "_id" : ObjectId("4c28f62cbf8544c60506f11e"),
    "pk": 3,
    "forums": [{
        "pk": 2,
        "thread_count": 1, 
        "post_count": 1,
    }]
}

Я могу, конечно, сделать его на трех шагах:

  1. Upsert целый набор с новым объектом
  2. addToSet объект форума к списку
  3. инкрементный объект форума отвечает позиционным оператором

То есть:

db.mycollection.update({pk:3}, {pk:3}, true)
db.mycollection.update({pk:3}, {$addToSet: {forums: {pk:2}}})
db.mycollection.update({pk:3, 'forums.pk': 2}, {$inc: {'forums.$.thread_counter': 1, {'forums.$.post_counter': 1}})

Вы знаете о более эффективном способе сделать это? TIA, Germano

6
задан Germano 12 August 2010 в 12:12
поделиться