Как исправить агрегатный $ Mongo-фильтр MongoDB - PullRequest
1 голос
/ 13 мая 2019

У меня есть данные, которые выглядят так:

{
  "_id" : 1,
  "data" : [
    {
      "id" : 1,
      "one" : [
        {"user" : 2, "two" : 2},
        {"user" : 1, "two" : 3}
      ]
    }
  ]
}
{
  "_id" : 2,
  "data" : [
    {
      "id" : 2,
      "one" : [
        {"user" : 2, "two" : 2},
        {"user" : 1, "two" : 3}
      ]
    }
  ]
}

И я хочу отфильтровать в совокупности (так как данные выше взяты из предыдущих этапов), так что один массив фильтруется, чтобы показать только один массивэлементы, где пользователь равен _id.

Следующее возвращает пустые один массив, как получить фильтр для заполнения одного массива, как я ожидаю?

db.parks.aggregate([{$project: {_id: 1, 'data.id': 1, 'data.one':
{$filter: {
  input: '$data.one',
  as: 'un',
  cond: {$eq: ['$$un.user', '$_id']}}
}}}]).pretty()

Что дает:

{ "_id" : 1, "data" : [ { "id" : 1, "one" : [ ] } ] }
{ "_id" : 2, "data" : [ { "id" : 2, "one" : [ ] } ] }

Замена '$ _id' на '$$ un.user' показывает все элементы data.one, как и ожидалось, поэтому похоже, что проблема в выражении $ eq.

Как мне заставить фильтр показывать один массив, как я ожидаю?

1 Ответ

1 голос
/ 13 мая 2019

Вы можете использовать ниже агрегации

db.collection.aggregate([
  { "$project": {
    "data": {
      "$filter": {
        "input": {
          "$map": {
            "input": "$data",
            "in": {
              "id": "$$this.id",
              "one": {
                "$filter": {
                  "input": "$$this.one",
                  "as": "on",
                  "cond": { "$eq": ["$$on.user", "$_id"] }
                }
              }
            }
          }
        },
        "as": "d",
        "cond": { "$eq": ["$$d.id", "$_id"] }
      }
    }
  }}
])

MongoPlayground

...