Ошибка Mongo/Mongoose Неверная ошибка атомарного обновления
Я пытаюсь написать, чтобы написать обновление для документа Mongo, используя функцию Mongoose findOneAndUpdate. По сути, у меня есть документ, в котором есть массив другой Схемы, и когда я пытаюсь добавить больше этих типов схемы, я получаю следующую ошибку:
[Error: Invalid atomic update value for $__. Expected an object, received object]
Мне сложно понять, что означает эта ошибка, а тем более ее источник.
Данные, которые я пытаюсь обновить, следующие:
{ section_id: 51e427ac550dabbb0900000d,
version_id: 7,
last_editor_id: 51ca0c4b5b0669307000000e,
changelog: 'Added modules via merge function.',
committed: true,
_id: 51e45c559b85903d0f00000a,
__v: 0,
modules:
[ { orderId: 0,
type: 'test',
tags: [],
data: [],
images: [],
content: ["Some Content Here"] },
{ orderId: 1,
type: 'test',
tags: [],
data: [],
images: [],
content: ["Some Content Here"] },
{ orderId: 2,
type: 'test',
tags: [],
data: [],
images: [],
content: ["Some Content Here"] },
{ orderId: 3,
type: 'test',
tags: [],
data: [],
images: [],
content: ["Some Content Here"] },
{ orderId: 4,
type: 'test',
tags: [],
data: [],
images: [],
content: ["Some Content Here"] },
{ orderId: 5,
type: 'test',
tags: [],
data: [],
images: [],
content: ["Some Content Here"] } ] }
Единственное различие заключается в том, что когда я его извлекаю, существует еще три модуля, и я добавляю некоторые новые в массив.
Хотелось бы услышать какие-то мысли, по крайней мере, о том, что означает ошибка!
Ответы
Ответ 1
Это, вероятно, потому, что обновленный объект все еще является объектом Mongoose.
Попробуйте преобразовать его в объект JS до findOneAndUpdate
object = object.toString()
И удалите любой потенциальный атрибут идентификатора
delete object._id
Или просто
object = object.toObject();
Ответ 2
У меня была такая же проблема, и оказалось, что я неправильно использовал $push. Я делал
{$push:thing_to_push}
Но это должно быть
{$push:{list_to_push_into:thing_to_push}}
Ответ 3
@Магрело и @plus привели меня к ответу, который сработал. Что-то вроде:
MyModel.findOneAndUpdate({ section_id: '51e427ac550dabbb0900000d' }, mongooseObject.toObject(), { upsert: true }, function(err, results) {
//...
});
Ответ 4
У меня была такая же проблема. Я закончил с помощью метода finOne()
создайте новый, если он не найден, обновите существующий, если он найден.
Я знаю, что есть две операции. но я просто не нашел способ сделать это за один шаг.
Ответ 5
Еще одна вещь, которую нужно проверить, - это передать массив изменений в $set. Сообщение об ошибке, которое я получил при вызове примерно так:
db.products.update( { sku: "abc123" },
{ $set: [
{quantity: 500},
{instock: true}
]
}
)
Дал мне [Ошибка: недопустимое значение атомного обновления для $set. Ожидаемый объект, полученный объект]
Изменение его на обработанный объект.
db.products.update( { sku: "abc123" },
{ $set: {
quantity: 500,
instock: true
}
}
)
Ответ 6
Попробуйте передать значение параметра обновления как строку вместо объекта модели mongoose. У меня была такая же ошибка, когда я использовал для передачи объекта модели. Ниже приведено различие в коде.
Код, у которого возникла проблема:
updateUser: function(req, res) {
**var updatedUserModel = new Users(req.body);**
Users.findOneAndUpdate({tpx_id:req.params.id}, {$set:**updatedUserModel**}, function(err, User){
...
}
}
Рабочий код:
updateUser: function(req, res) {
Users.findOneAndUpdate({tpx_id:req.params.id}, {$set:**req.body**}, function(err, User) {
...
}