mongodb Фильтрация состояния содержимого, связанного с объектом в массиве - PullRequest
0 голосов
/ 03 января 2019

Я хочу импортировать данные через функцию фильтрации.

Я думаю, что мы, вероятно, должны использовать «агрегат» вместо «найти».

Условия для данных, которые я хочу:

  1. Есть Коллекция и Коллекция В.

  2. «Содержимое» коллекции A указывает на «_id» коллекции B.

  3. Соответствующее значение выбирается только в том случае, если значение «Видимость» коллекции B равно «true».

Коллекция «А»:

{
   "_id" : ObjectId("aaaaa"),
    "title" : "study list",   
    "contents" : [ ObjectId("11111"), ObjectId("22222") ]
}
{
   "_id" : ObjectId("bbbbb"),
    "title" : "study list",   
    "contents" : [ ObjectId("33333"), ObjectId("44444") ]
}
{
   "_id" : ObjectId("ccccc"),
    "title" : "study list",   
    "contents" : [ ObjectId("55555") ]
}

Коллекция "B":

{
   "_id" : ObjectId("11111"),
    "visibility" : true
}
{
   "_id" : ObjectId("22222"),
    "visibility" : true
}
{
   "_id" : ObjectId("33333"),
    "visibility" : true
}
{
   "_id" : ObjectId("44444"),
    "visibility" : false
}
{
   "_id" : ObjectId("55555"),
    "visibility" : false
}

== Результат данных

{
   "_id" : ObjectId("aaaaa"),
    "title" : "study list",   
    "contents" : [ ObjectId("11111"), ObjectId("22222") ]
}

Как получить нужные данные?

1 Ответ

0 голосов
/ 03 января 2019

Вы можете использовать ниже агрегации

db.collectionA.aggregate([
  { "$lookup": {
    "from": "collectionB",
    "localField": "contents",
    "foreignField": "_id",
    "as": "data"
  }},
  { "$match": {
    "data": {
      "$not": {
        "$elemMatch": { "visibility": false }
      }
    }
  }}
])
...