Как использовать $ во внутреннем $ или оператор в MongoDb? - PullRequest
1 голос
/ 21 апреля 2020

У меня есть данные в виде следующих документов ...

[
  {
    "_id":"5e93193f755fc5e74beb5e8f",
    "orgs":[
      {
        "type":"NonEmployee",
        "roles":[]
      },
      {
        "type":"Founder",
        "roles":[
          {
            "_id":"5e44fd4546b3954e6930e83d",
            "name":"ADMIN"
          },
          {
            "_id":"5e44fd4546b3954e6930e83e",
            "name":"EMPLOYEE"
          }
        ]
      }
    ]
  }
]

Интересующий меня запрос состоит в том, чтобы фильтровать документы на основе условий "ИЛИ" следующих ...

  • Если он имеет тип как NonEmployee
  • Если он играет роль в данном массиве, например. roleArray = ['EMPLOYEE']

Подзапрос в совокупности выглядит примерно так:

{
  $match: {
     $expr: {
      $or: [
        {
          $in: ["$orgs.roles.name", rolesArray]
        },
        {
          $eq: ['$orgs.type', 'NonEmployee']
        }
      ]
    }
  }
}

Это дает результат в виде пустого массива, поскольку запрос неверен. Есть ли возможный способ добиться этого?

Ответы [ 2 ]

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

Вы можете запросить его с помощью elematch , который соответствует всем указанным критериям запроса.

Вы можете обратиться к do c: https://docs.mongodb.com/manual/reference/operator/query/elemMatch/

0 голосов
/ 22 апреля 2020

Интересующий меня запрос состоит в том, чтобы фильтровать документы на основе следующих условий "ИЛИ" ...

  • Если тип имеет тип NonEmployee
  • Если он играет роль в указанном массиве eg.rolesArray = ['EMPLOYEE']

Запрос агрегации, использующий $match stage и операторы $or и $in:

ROLES_ARRAY =  [ "EMPLOYEE", "OTHER" ]

db.collction.aggregate( [
  { 
      $match: { 
          $or: [ { "orgs.roles.name": { $in: ROLES_ARRAY  } }, { "orgs.type": "NonEmployee" } ] 
      } 
  }
] )

Тот же запрос с использованием метода find:

db.collection.find( { $or: [ { "orgs.roles.name": { $in: ROLES_ARRAY  } }, { "orgs.type": "NonEmployee" } ] } )
...