Удалить элемент из подмассива, используя этап агрегации, применяемый к потоку изменений в MongoDB? - PullRequest
1 голос
/ 11 июля 2020

Я использую MongoDB 4.2, и я ищу способ удалить все элементы из подмассива, если он не соответствует определенному условию, используя этап агрегации, совместимый с потоками изменений . совместимые этапы :

  • $ addFields
  • $ match
  • $ project
  • $ replace Root
  • $ replaceWith
  • $ redact
  • $ set
  • $ unset

Например, предположим, что у нас есть коллекция, пользователи , содержащий документы в этом формате:

{ "name" : "John Doe", 
  "access": [
                { "level" : "Gold", "rating" : 3.2 }, 
                { "level" : "Silver", "rating" : 2.1 }, 
                { "level" : "Gold", "rating" : 4.2 } 
             ] 
}

Я хотел бы использовать одну или комбинацию совместимых этапов агрегации для удаления элементов в массиве "доступа", которые не соответствуют фильтру, например как { $elemMatch : { "level" : "Gold" } }. Я бы хотел, чтобы итоговый документ выглядел так:

{ "name" : "John Doe", 
  "access": [
                { "level" : "Gold", "rating" : 3.2 }, 
                { "level" : "Gold", "rating" : 4.2 } 
             ] 
}

Можно ли это сделать в MongoDB?

1 Ответ

1 голос
/ 11 июля 2020

Вы можете использовать $addFields / $set вместе с $filter

db.collection.aggregate({
  $set: {
    access: {
      $filter: {
        input: "$access",
        cond: { $eq: ["$$this.level", "Gold"] } // your condition expression
      }
    }
  }
})

Пн go Детская площадка

Если вы хотите обновить существующие документы, вы можете сделать это с помощью конвейера обновления следующим образом:

db.test.updateMany({
  access: { $elemMatch: { level: { $ne: "Gold" } } }, // find elements that does not match your condition
  [{
    $set: {
      access: {
        $filter: {
          input: "$access",
          cond: { $eq: ["$$this.level", "Gold"] } // your condition expression
        }
      }
    }
  }]
)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...