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 ответ
Итак, я нашел пару проблем с вашим запросом.
В вашем документе
_id
Поле является текстовым значением, но в запросе вы используете его как числовое.По вашему запросу
channelStatuses.channel: {$eq: "BAR"}
является недействительным. Ключ JSON не может иметь.
внутри, если вы не избежите двойных кавычек.Вы можете упростить
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"
}
]
}