Могу ли я объединить $ pushAll и $ inc в одном выражении?
Перед объединением это прекрасно работает:
db.createCollection("test");
db.test.insert({"name" : "albert", "bugs" : []});
db.test.update({"name":"albert"},
{"$pushAll" : {"bugs" : [{"name":"bug1", "count":1}]}});
db.test.update({"name":"albert"},
{"$inc" : {"bugs.0.count" : 1}});
db.test.update({"name":"albert"},
{"$pushAll" : {"bugs" : [{"name":"bug2", "count":1}]}});
Но когда я пытаюсь объединить это так:
db.createCollection("test");
db.test.insert({"name" : "albert", "bugs" : []});
db.test.update({"name":"albert"},
{"$pushAll" : {"bugs" : [{"name":"bug1", "count":1}]}});
db.test.update({"name":"albert"},
{
"$pushAll" : {"bugs" : [{"name":"bug2", "count":1}]},
"$inc" : {"bugs.0.count" : 1}
}
);
Эта ошибка происходит:
have conflicting mods in update
Интересно, это можно сделать, а также я представляю себе объединение не только pushAll и inc, но я не уверен, поддерживается ли это или нет?
обновление 23 марта 2012 г.
Я пробовал несколько $ inc для разных элементов массива, и это работает (хотя и не правильно. Цитируется из приведенного ниже ответа, чтобы уточнить, почему этот doensnt работает хорошо и что работает: The correct way to increment both fields is as follows: > db.test.update({"name":"albert"}, {"$inc" : {"bugs.0.count" : 1, "bugs.1.count" : 1}})
:
db.test.update({"name":"albert"},
{
"$inc" : {"bugs.0.count" : 1},
"$inc" : {"bugs.1.count" : 1}
}
);
И эта комбинация $ set и $ inc для разных элементов массива также работает:
db.test.update({"name":"albert"},
{
"$set" : {"bugs.0.test" : {"name" : "haha"}},
"$inc" : {"bugs.0.count" : 1},
"$inc" : {"bugs.1.count" : 1}
}
);
Но скомбинируйте все это с $ push или $ pushAll, все пойдет с ошибкой.
Итак, мой текущий вывод состоит в том, что проблема не в нескольких операциях над несколькими элементами в одном массиве, а в том, что объединение этих операций с $ push или $ pushAll, которые могут изменить массив, является проблемой.