Как запросить массив внутри вложенного объекта с помощью mon goose? - PullRequest
1 голос
/ 29 мая 2020

У меня сложный объект, хранящийся в моем mongodb, выглядит следующим образом:

     const collectionFromMongodb = [
      {
        id: ObjectID(),
        text: 'blabla',
        data: {
          foo: [
            { id: ObjectID(), status: 'ready' },
            { id: ObjectID(), status: 'notready' },
          ],
          bar: [
            { id: ObjectID(), status: 'ready' },
            { id: ObjectID(), status: 'notready' },
          ],
        },
      },
    ];

Я хочу запросить весь объект (find), но возвращаемый объект будет в foo и bar только объект, который status равен ready. (data.foo.[?].status === 'ready' and/or data.bar.[?].status === 'ready').

Я ожидаю получить весь объект (так как мой фильтр работает только на data), но поля foo и bar содержат только status из 'ready'.

Примечание. В foo и bar у меня размер данных 1 МБ.

Как это сделать с помощью запроса mon goose? это возможно сделать? или просто запросите все объекты и используйте filter и map?

Я сделал это, но не работает, потому что он получает все статусы в data.foo:

find('data.foo': { $elemMatch: { status: 'ready' })

1 Ответ

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

Надеюсь, это то, что вам нужно. Измените конвейер $ match на то, что вам нужно найти.

https://mongoplayground.net/p/o1qk4wla5C6

db.collection.aggregate([
  {
    $match: {
      "data.bar.status": "ready"
    }
  },
  {
    $project: {
      "data.foo": {
        $filter: {
          input: "$data.foo",
          as: "foo",
          cond: {
            $eq: [
              "$$foo.status",
              "ready"
            ]
          }
        }
      },
      "data.bar": {
        $filter: {
          input: "$data.bar",
          as: "bar",
          cond: {
            $eq: [
              "$$bar.status",
              "ready"
            ]
          }
        }
      }
    }
  }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...