Получить вложенные данные из MongoDB - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть коллекция в следующем формате.

{
    "_id": "ffffc446-f33d",
    "className": "com.ezdx.vist.model.Visit",
    "organizationId": "0a0beff7-fe1e-4ab7",
    "centerId": "9aef68fe-dffd-4a7d-b0ee-f8dd3fc03303",
    "tests": [{
            "result": 157,
            "type": "PHYSICAL",
            **"name": "HEIGHT",**
            "consumableQuantity": 0,
            "testCost": 0,
            "testExpenseConsumable": 0

        },
        {
            "result": 8,
            "type": "RDT",
            **"name": "URIC",**
            "consumableQuantity": 0,
            "testCost": 0,
            "testExpenseConsumable": 0
        }

    ],
    "repeatVisit": true
}

Я хочу коллекцию, где test.name = "Uri c" и с определенными столбцами.

  {
    "result": 8,
    "type": "RDT",
    **"name": "Uric",**
    "consumableQuantity": 0,
    "testCost": 0,
    "testExpenseConsumable": 0
}

Каким-то образом мне удается получить нужные коллекции, но я не могу получить нужный формат. Ниже мой запрос

db.visits.aggregate( [ { $unwind : "$tests" }, 
{ $match: { $and: [{"tests.name":"URIC"}]
    } } ] )

Ответы [ 2 ]

1 голос
/ 16 февраля 2020

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

db.collection.aggregate([
  {
    $project: {
      items: {
        $filter: {
          input: "$tests",
          as: "item",
          cond: {
            $eq: [
              "$$item.name",
              "URIC"
            ]
          }
        }
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        $arrayElemAt: [
          "$items",
          0
        ]
      }
    }
  }
])

Playground

1 голос
/ 16 февраля 2020

Попробуйте: $ replaceWith (= v4.2) или $ replace Root (> = v3.4)

db.visits.aggregate([
  {
    $unwind: "$tests"
  },
  {
    $match: {
      "tests.name": "URIC"
    }
  },
  {
    $replaceWith: "$tests"
  }
])

MongoPlayground

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...