mongodb соответствует всем условиям с одним элементом массива - PullRequest
0 голосов
/ 08 мая 2020

У меня есть массив таких тестов,

{

    "tests" : [

        {
            "testId" : "1",
            "details" : {
                "status" : "Completed"
            }
        },
        {
            "testId" : "2",
            "details" : {
                "status" : "InProgress"
            }
        },
        {
            "testId" : "3",
            "details" : {
                "status" : "Completed"
            }
        },
    ]
}

Я хочу найти полные тесты с идентификатором 1 или 2. Поэтому я написал такой запрос на совпадение

{
  $match : { $and : [ { "tests.testId" : { $in : [1, 2] } }
                    ,{ "tests.details.status" : "Completed" }
                   ] 
          } 
}

Проблема с этим запросом в том, что он выбирает все документы с идентификаторами 1 или 2, даже если статус не завершен. Например, приведенный выше запрос извлекает эти два документа

        {
            "testId" : "1",
            "details" : {
                "status" : "Completed"
            }
        },
        {
            "testId" : "2",
            "details" : {
                "status" : "InProgress"
            }
        },

Мне нужно выполнить запрос для поиска элемента массива parituclat для обоих условий.

Я также пробовал с $elemMatch . Это все еще не работает. Любая помощь приветствуется.

1 Ответ

2 голосов
/ 08 мая 2020

Мы можем использовать конвейер aggregate с $filter для возврата только согласованных элементов массива

попробуйте это

db.collection.aggregate([
  {
    $match: { // to filter the documents
      $and: [
        {
          "tests.testId": { $in: ["1", "2"] }
        },
        {
          "tests.details.status": "Completed"
        }
      ]
    }
  },
  {
    $project: { // then use this $project stage to use the $filter operator in it
      tests: {
        $filter: { // this is to filter the tests array
          input: "$tests",
          as: "test",
          cond: {
            $and: [
              {
                $in: [
                  "$$test.testId", ["1", "2"] 
                ]
              },
              {
                $eq: [
                  "$$test.details.status",
                  "Completed"
                ]
              }
            ]
          }
        }
      }
    }
  }
])

вы можете проверить это здесь Mon go Игровая площадка

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

Обратите внимание: если testId имеет тип ObjectId, тогда вы должны использовать ObjectId, а не строки в агрегатном конвейере

...