Невозможно поместить элемент в массив MongoDB в документе при использовании Waterline

Я борюсь с вызовом обновления, который по какой-то причине не работает. Для краткого контекста у нас есть приложение Node.js, работающее на Sails.js с Waterline ORM.

Согласно моему файлу package.json, вот версии, которые я использую:

  • подключить-монго: ^ 1.3.2
  • монгодб: ^ 2.2.29
  • паруса: ~0,12,4
  • паруса-монго: ^ 0.12.3

У меня есть коллекция под названием «продукты», и каждый продукт выглядит в базе данных следующим образом:

{
    "_id" : ObjectId("59d5f12025423dc0261c911d"),
    "category" : ObjectId("59a9bcf984d756998eaa22e5"),
    "status" : "pendingReview",
    "isDeleted" : false,
    "events" : [
        {
            "when" : 1507193120,
            "actor" : "56cc0f76e1a25cde0d2c15ab",
            "action" : "Submitted product",
            "note" : "Jeff added this product. It is awaiting review."
        }
    ],
    "productId" : "171005-00000",
    "createdAt" : ISODate("2017-10-05T08:45:20.538Z"),
    "updatedAt" : ISODate("2017-10-05T08:45:20.538Z")
}

У меня есть пользовательский интерфейс, в котором пользователь может «одобрить» несколько продуктов, прежде чем они будут показаны посетителям веб-сайта. Для этого я хочу просто обновить несколько записей, изменив ключ status на «одобрено» и добавив событие в массив events каждого документа. Событие должно находиться в позиции 0 массива. Я пытаюсь обновить эти записи с помощью следующего кода, но он не работает:

var moment = require('moment');
Products.native(function(error, collection) {

    if (error) {
        throw error;
    }

    collection.update(
        { _id: ['59d5f12025423dc0261c911d'] },
        { 
            $set: {
                status: 'approved',
                $push: {
                    events: {
                        when: moment().unix(),
                        actor: req.body.userId,
                        action: 'Approved product',
                        note: req.body.userName + ' approved this product.'
                    }
                }
            }
        },
        { multi: true },
        function(error, count, status) {

        if (error) {
            sails.log.error(error);
            return res.serverError('Database error. Reference ID: ' + req.referenceId);
        }

        return res.ok(count);
    });
});

Когда я запускаю этот запрос, я не получаю никаких ошибок, и когда я проверяю свою базу данных, запись не была обновлена. Я получаю следующие данные, когда я запускаю запрос:

{
    "ok": 1,
    "nModified": 0,
    "n": 0
}

Что тут происходит? Почему не обновляется? Если я правильно понимаю, запрос может найти документ, но он не обновляется. Это правильно? Если да, то как мне это решить? Спасибо.


person JackH    schedule 09.10.2017    source источник


Ответы (1)


$push должен быть на том же уровне, что и $set. Оба операторы...

Это означает, что вы должны измениться следующим образом:

{ 
    $set: {
        status: 'approved'
    },
    $push: {
        events: {
            when: moment().unix(),
            actor: req.body.userId,
            action: 'Approved product',
            note: req.body.userName + ' approved this product.'
        }
    }
}
person Salketer    schedule 09.10.2017
comment
Вот оно! Благодарю вас! - person JackH; 10.10.2017