Использование 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" }]}}),