Я пытаюсь обновить/заменить один элемент из массива строк. Как я могу сделать это в монгодб?
Я пытался использовать версию mongodb >= 4, mongoose >= 5 и nodejs >= v12.2.0.
Это мое обновление:
{
_id: bot._id,
intents: {
$elemMatch: {
name: "car",
examples: "blue",
},
},
},
{
$set: { 'intents.$[outer].examples.$[inner]': "yellow" },
},
{
arrayFilters: [
{ 'outer.name': "car" },
{ 'inner.examples': "blue" },
],
},
Это единый документ:
{
"_id" : ObjectId("5cff64bacea5f52b74cefd57"),
"name" : "a",
"language" : "en",
"userId" : "auth0|5ce2ce9fb0ada80ea32d7643",
"cloudBotId" : "4327a229-ec34-423e-b9ad-4778cf74b0a0",
"intents" : [
{
"examples" : [
"blue"
],
"name" : "car"
},
{
"examples" : [
"red"
],
"name" : "bike"
}
],
"__v" : 0
}
Я рассчитываю заменить «синий» на «желтый».
Вы были рядом... не нужно добавлять примеры в ваши arrayFilters, просто используйте inner :
{
_id: bot._id,
intents: {
$elemMatch: {
name: "car",
examples: "blue",
},
},
},
{
$set: { 'intents.$[outer].examples.$[inner]': "yellow" },
},
{
arrayFilters: [
{ 'outer.name': "car" },
{ 'inner': "blue" },
],
}
Но я думаю, что у меня будет больше производительности с examples: "blue"
, потому что, если у меня есть какое-то намерение.name eq car
и нет в примерах с blue
, вероятно, я пропущу часть arrayFilter, выполняющую операции.
Отлично, это работает. Поскольку у меня есть
$elemMatch
имя запроса «автомобиль», я удалил из$elemMatch
examples: "blue"
и из arrayFilters также{"outer.name": "car"}
, а для последнего я изменил$set
на$set: { 'intents.$.examples.$[inner]': "yellow" }
Как вы думаете, это хорошо?