Удалить (обновить запрос) только определенный элемент в массиве массива mongodb? - PullRequest
1 голос
/ 04 апреля 2020

Мои входные данные

{
   _id: 1,
   results: [
      { item: "A", score: 5, answers: [ { q: 1, a: 4 }, { q: 2, a: 6 } ] },
      { item: "B", score: 8, answers: [ { q: 1, a: 8 }, { q: 2, a: 9 } ] }
   ]
}
{
   _id: 2,
   results: [
      { item: "C", score: 8, answers: [ { q: 1, a: 8 }, { q: 2, a: 7 } ] },
      { item: "B", score: 4, answers: [ { q: 1, a: 0 }, { q: 2, a: 8 } ] }
   ]
}

ожидаемый вывод запроса обновления

{
   _id: 1,
   results: [
      { item: "A", score: 5, answers: [ { q: 1, a: 4 }, { q: 2, a: 6 } ] },
      { item: "B", score: 8, answers: [ { q: 1, a: 8 }] }
   ]
}

{
   _id: 2,
   results: [
      { item: "C", score: 8, answers: [ { q: 1, a: 8 }, { q: 2, a: 7 } ] },
      { item: "B", score: 4, answers: [ { q: 1, a: 0 } }
   ]
}

Пробный запрос в этом руководстве mongoDb для $ pull, но данные не такие, как ожидалось. Вывод приведенного ниже кода просто удаляет весь элемент, а не дочерний элемент

db.collection.update(
  { },
  { $pull: { results: { $elemMatch: { score: 8 , item: "B" } } } },
  { multi: true }
)

1 Ответ

1 голос
/ 04 апреля 2020

используемый вами запрос удаляет любой элемент, у которого есть оценка = 'B' и элемент = '8' из массива результатов.

массив ответов встроен в массив результатов, поэтому, если вам нужно удалить некоторые элементы из массива ответов, вам нужно добавить свои проверки к ответам, а не к результатам, например, если вам нужно удалить ответы, которые имеют q = 1 и a = 8, тогда запрос должен выглядеть примерно так:

db.collection.update(
  { },
  { $pull: { 'results.$[].answers': { q: 1, a: 8 } } },
  { multi: true }
)

это обновит массив ответов, а не массив результатов, результат этого запроса будет

{
   _id: 1,
   results: [
      { item: "A", score: 5, answers: [ { q: 1, a: 4 }, { q: 2, a: 6 } ] },
      { item: "B", score: 8, answers: [ { q: 2, a: 9 } ] }
   ]
}
{
   _id: 2,
   results: [
      { item: "C", score: 8, answers: [ { q: 2, a: 7 } ] },
      { item: "B", score: 4, answers: [ { q: 1, a: 0 }, { q: 2, a: 8 } ] }
   ]
}
...