Mon go DB для фильтрации документа, если поле массива имеет одинаковое значение для всех элементов с использованием драйвера mon go java - PullRequest
2 голосов
/ 13 июля 2020

Мне нужно получить документ из базы данных, данные следующие

{
   "systemName": "ABC",
    "systemUsageAttrs" : [
                          {
                           "cpuUsage": 30,
                           "memUsage": 40,
                           "isActive": false
                           },
                           {
                           "cpuUsage": 88.2,
                           "memUsage": 33.5,
                           "isActive": false
                           }
                         ]
},
{
   "systemName": "DEF",
    "systemUsageAttrs" : [
                          {
                           "cpuUsage": 30,
                           "memUsage": 40,
                           "isActive": false
                           },
                           {
                           "cpuUsage": 88.2,
                           "memUsage": 33.5,
                           "isActive": true
                           }
                         ]
},
{
   "systemName": "GHI",
    "systemUsageAttrs" : [
                          {
                           "cpuUsage": 30,
                           "memUsage": 40,
                           "isActive": true
                           },
                           {
                           "cpuUsage": 88.2,
                           "memUsage": 33.5,
                           "isActive": true
                           }
                         ]
}

Я использовал фрагмент кода ниже, но он возвращает 2 документа вместо одного.

List<Document> systemDetailsAL = sysUsageDetailsColl.aggregate(
                asList(
                        unwind("$systemUsageAttrs"),
                        match(eq("systemUsageAttrs.isActive",false)),
                        group("$_id", Accumulators.first("systemName","$systemName"),
                                Accumulators.push("systemUsageAttrs", "$systemUsageAttrs")),
                        project(Projections.fields(Projections.excludeId()))
                        
                        )
                ).into(new ArrayList<Document>());

Приведенный выше код также предоставляет документ, который имеет isActive: false для одного из элементов в массиве.

Ожидаемый результат - Document с systemName: AB C, так как он имеет isActive: false во всех элементах массива.

Любая помощь / указатели приветствуются.

1 Ответ

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

Воспроизвести

db.collection.find({
  "systemUsageAttrs": {
    "$not": {
      "$elemMatch": {
        "isActive": {
          $nin: [
            false
          ]
        }
      }
    }
  }
})

$not исключает документы, обозначенные $elemMatch, где значение не является ложным.

  1. $elemMatch идентифицирует документы, где isActive отсутствует в false
  2. $not исключает эти документы.

Вы можете преобразовать этот запрос в java совместимый.

Проблема с кодом, т. Е. Используемым запросом:

  1. Вы делаете unwind
  2. Затем поиск всех документов - он возвращает первую подпрограмму c второго документ
  3. Вы снова группируете
  4. У него также будет второй документ, потому что он является частью предыдущего конвейера.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...