MongoDB: Получить все элементы $ matched по отдельности из массива - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь получить все соответствующие элементы по отдельности, здесь - это пример данных и запроса.

// json
[
  {
    "name": "Mr Cool",
    "ican": [
      {
        "subcategory": [
          {
            "id": "5bffdba824488b182ec86f8d", "name": "Cricket"
          },
          {
            "id": "5bffdba824488b182ec86f8c", "name": "Footbal"
          }
        ],
        "category": "5bffdba824488b182ec86f88",
        "name": "Sports"
      }
    ]
  }
]

// query
db.collection.aggregate([
  {
    "$match": {
      "ican.subcategory.name": { $in: ["Cricket","Football"] }
    }
  },
  {
    "$project": { "_id": 1, "name": 1, }
  }
])

Я получаю комбинированный результат, мне нужна индивидуальная запись матча.Я попытался $all и $elementMatch, но получил тот же ответ.Как я могу получить результаты, как показано ниже.Я использую $aggregate, потому что я буду использовать $geoNear конвейер для получения соседних пользователей.

// current result
[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "name": "Mr Cool"
  }
]

// expected result
[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "name": "Mr Cool",
    "subcategory: "Cricket"
  },
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "name": "Mr Cool",
    "subcategory: "Footbal"
  }
]

Спасибо

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Вы можете использовать агрегацию ниже без $unwind и для лучшей производительности

db.collection.aggregate([
  { "$match": { "ican.subcategory.name": { "$in": ["Cricket","Football"] }}},
  { "$project": {
    "ican": {
      "$reduce": {
        "input": "$ican",
        "initialValue": [],
        "in": {
          "$concatArrays": [
            { "$filter": {
              "input": {
                "$map": {
                  "input": "$$this.subcategory",
                  "as": "s",
                  "in": { "name": "$name", "subcategory": "$$s.name" }
                }
              },
              "as": "fil",
              "cond": { "$in": ["$$fil.subcategory", ["Football"]] }
            }},
            "$$value"
          ]
        }
      }
    }
  }},
  { "$unwind": "$ican" },
  { "$replaceRoot": { "newRoot": "$ican" }}
])
0 голосов
/ 29 ноября 2018

Попробуйте это Монго Playground

db.col.aggregate([
    {"$unwind" : "$ican"},
    {"$unwind" : "$ican.subcategory"},
    {"$match" : {"ican.subcategory.name": { "$in": ["Cricket","Football"] }}},
    {"$group" : {"_id" : null,"data" : {"$push" : {"_id" : "$_id","name" : "$name","subcategory" : "$ican.subcategory.name"}}}},
    {"$unwind" : "$data"},
    {"$replaceRoot" : {"newRoot" : "$data"}}
])
...