Поисковый запрос Mongodb на основе поля массива - PullRequest
0 голосов
/ 27 мая 2020

Коллекция:

{
         "_id" : ObjectId("57506d74c469888f0d631be6"),
         "name" : "mycollection",
         "details" : [ 
             {
                 "date" : "25/03/2020",
                 "number" : "A",
                 "active" : false
              }
        },
{
        "_id" : ObjectId("57506d74c469888f0d631usi"),
        "name" : "newcollection",
        "details" : [ 

            {
                "date" : "30/03/2020",
                "number" : "C",
                "active" : false
            } 
        },
{
        "_id" : ObjectId("57506d74c4633388f0d631usi"),
        "name" : "mycollection",
        "details" : [ 

            {
                "date" : "31/03/2020",
                "number" : "C",
                "active" : false
            }
        },
    }

Поисковый запрос для получения значений на основе активного статуса в поле сведений.

Я пробовал:

db.collection.find(
    {"name": "mycollection", "details": {"active": False}})

Ожидаемый результат: мне нужны коллекции, в которых активное значение false в поле сведений в каждой коллекции. Здесь должны отображаться идентификаторы записи ObjectId («57506d74c469888f0d631be6») и ObjectId («57506d74c4633388f0d631usi»).

Ответы [ 3 ]

1 голос
/ 27 мая 2020

Запрос для mongodb или robomon go такой же, как и в вашем случае, find () может работать, но я выбираю агрегат, который может фильтровать значения.

Пример запроса:

db.getCollection('collection').aggregate([{$match: {'details.active': {$ne: true},"name":"mycollection"}}]) 

Просто. Но, пожалуйста, проверьте и вернитесь.

1 голос
/ 27 мая 2020

Если в массиве деталей могут быть некоторые объекты с active = true, а некоторые объекты = false, и вам нужно получить только объекты с active = false, тогда мы можем использовать $ filter в конвейере агрегации для фильтрации массива деталей

ваш запрос может быть примерно таким

db.collection.aggregate([
  {
    $match: {
      name: "mycollection",
      "details.active": false
    }
  },
  {
    $project: {
      name: 1,
      details: {
        $filter: {
          input: "$details",
          as: "elem",
          cond: {
            $eq: ["$$elem.active", false]
          }
        }
      }
    }
  }
])

вы можете протестировать его здесь

надеюсь, что это поможет

1 голос
/ 27 мая 2020

Документы содержат раздел по этому типу запроса здесь: https://docs.mongodb.com/manual/tutorial/query-array-of-documents/

Ваш запрос не работает, поскольку этот синтаксис требует, чтобы массив содержал именно этот объект, но документы в вашем массиве содержат дополнительные поля, поэтому нет совпадений.

Запрос для этого случая - db.collection.find({"name": "mycollection", "details.active": False}).

Примечание: это вернет все документы, в которых массив содержит объекты с active == false, но не будет фильтровать фактические массивы для удаления любых элементов с active = true.

...