Использование MongoDB $pull для удаления документов в массиве
У меня есть коллекция в MongoDB, которая выглядит следующим образом:
{
"_id" : "5327010328645530500",
"members" : [
{
"participationCoeff" : 1,
"tweetID" : "5327010328645530500"
},
{
"participationCoeff" : 1,
"tweetID" : "2820402625046999289"
},
{
"participationCoeff" : 0.6666666666666666,
"tweetID" : "6122060484520699114"
},
{
"participationCoeff" : 1,
"tweetID" : "4656669980325872747"
}
]
}
{
"_id" : "2646953848367646922",
"members" : [
{
"participationCoeff" : 1,
"tweetID" : "2646953848367646922"
},
{
"participationCoeff" : 0.75,
"tweetID" : "7750833069621794130"
},
{
"participationCoeff" : 0.5,
"tweetID" : "6271782334664128453"
}
]
}
В принципе, коллекция имеет кластеры, где кластер имеет поле _id
и поле members
. Поле Members - это массив документов, имеющих следующий формат.
{
"participationCoeff" : 1,
"tweetID" : "5327010328645530500"
}
Теперь, время от времени, я должен удалить эти поддокументы в атрибуте участников документа кластера, сопоставляя tweetID.
Однако я не могу найти запрос для достижения этого эффекта. В принципе, tweetID будет участвовать во многих кластерах и, следовательно, будет отображаться в нескольких поддокументах атрибута "members" различных кластеров. Я хочу предоставить массовую операцию $pull, где я могу удалить все поддокументы во всех кластерах (т.е. Их атрибуты членов), которые соответствуют конкретному tweetID.
Некоторая помощь и интуиция будут действительно полезны.
Ответы
Ответ 1
То, что делает оператор $pull
, поэтому в оболочке вы можете использовать update
как:
db.clusters.update({},
{$pull: {members: {tweetID: '5327010328645530500'}}},
{multi: true})
Установите параметр multi
, чтобы обновить каждый документ, а не только первый.
Ответ 2
Это приведет к удалению нескольких твитов в одном запросе, просто передайте массив в $in: -
db.clusters.update({},
{$pull: {members: {$in: [ {tweetID: '5327010328645530500'},{"tweetID" : "2820402625046999289"} ] } } },
{multi: true})
Вышеуказанный метод не работает в мангусте
поэтому для мангуста выполните: -
db.clusters.update({}, {$ pull: {members: [{tweetID: '5327010328645530500'}, { "tweetID": "2820402625046999289" }]}}),