MongoDB Bulk.find.update() не изменяет объекты массива, а только добавляет новые

У меня проблема с MongoDB $set & $-operators. Я пытаюсь изменить существующий массив

Мой метод обновления выглядит примерно так (я не могу получить точную копию, как написано в Clojure/Monger):

    bulk.find({
            _id: 2,
            channelStatuses.channel: {$eq: "BAR"}
    }).update({
            $set: {"channelStatuses.$.status": "error" }
    });

Мои данные выглядят примерно так:

{
  "_id" : "1",
  "channelStatuses" : [
    {
      "channel" : "FOO",
      "status" : "done"
    }
  ]
},
{
  "_id" : "2",
  "channelStatuses" : [
    {
      "channel" : "BAR",
      "status" : "done"
    }
  ]
},
{
  "_id" : "3",
  "channelStatuses" : [
    {
      "channel" : "BAZ",
      "status" : "error"
    }
  ]
},
{
  "_id" : "3",
  "channelStatuses" : []
}

Поэтому я хочу изменить статус объекта channelStatuses документа с помощью _id = 2.

Вместо этого он создает новый объект внутри массива channelStatuses, и документ выглядит так:

    {
      "_id" : "2",
      "channelStatuses" : [
        {
          "channel" : "BAR",
          "status" : "done"
        },
        {
          "channel" : "BAR",
          "status" : ""
        }
      ]
    },

1 ответ

Решение

Итак, я нашел пару проблем с вашим запросом.

  1. В вашем документе _id Поле является текстовым значением, но в запросе вы используете его как числовое.

  2. По вашему запросу channelStatuses.channel: {$eq: "BAR"} является недействительным. Ключ JSON не может иметь . внутри, если вы не избежите двойных кавычек.

  3. Вы можете упростить channelStatuses.channel: {$eq: "BAR"} в "channelStatuses.channel": "BAR"

Теперь попробуйте следующий запрос и посмотрите, работает ли он.

var bulk = db.doc.initializeUnorderedBulkOp();

bulk.find({ 
  _id: "2", 
  "channelStatuses.channel": "BAR" 
  }).update({
            $set: {"channelStatuses.$.status": "error" }
  });

bulk.execute();

Следует просто обновить существующее поле. Смотрите окончательный вывод ниже

{ 
    "_id" : "1", 
    "channelStatuses" : [
        {
            "channel" : "FOO", 
            "status" : "done"
        }
    ]
}
{ 
    "_id" : "2", 
    "channelStatuses" : [
        {
            "channel" : "BAR", 
            "status" : "error"
        }
    ]
}
{ 
    "_id" : "3", 
    "channelStatuses" : [
        {
            "channel" : "BAZ", 
            "status" : "error"
        }
    ]
}
Другие вопросы по тегам