Я использую Mongo 3.6.3, и у меня есть база данных с коллекцией и элементом с _id, равным 1.
Я хочу обновить элемент, добавив объект и метку времени внутри этого объекта. Однако я получаю сообщение об ошибке. Вот что я делаю:
function MyObject() {
this.bar = {
apples: 4,
bananas: 5
};
}
collection.update({
_id: 1
}, {
$set: {
"foo": new MyObject()
},
$currentDate: {
"foo.time": {
$type: 'timestamp'
}
}
}, function (err) {
console.info(err.name, err.message);
});
и я получаю:
MongoError Updating the path 'foo.time' would create a conflict at 'foo'
Почему так случилось?
Если я сначала запустил операцию $set, а затем операцию $currentDate в другом update(), я получу желаемый результат:
{
"_id" : 1,
"foo" : {
"bar" : {
"apples" : 4,
"bananas" : 5
},
"time" : Timestamp(1523459420, 1)
}
}
Однако, если я попытаюсь выполнить их одновременно, как показано в приведенном выше коде, я получу сообщение об ошибке. Почему?





У вас не может быть нескольких операторов ($set и $currentDate), которые изменяют один и тот же путь (в данном случае foo). В вашем случае вы можете использовать точечную нотацию:
collection.update({
_id: 1
}, {
$set: {
"foo.bar.apples": 4,
"foo.bar.bananas": 5
},
$currentDate: {
"foo.time": {
$type: 'timestamp'
}
}
}, function (err) {
console.info(err.name, err.message);
});
или просто замените MyObject на this.time = new Date() вместо использования $currentDate.