Ошибка 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) {
   ...
}