массив $ filter в mongodb - PullRequest
       8

массив $ filter в mongodb

0 голосов
/ 04 июля 2018

Мне нужна ваша помощь, чтобы получить данные о сборе и состоянии. Предположим, у меня есть коллекция с указанным ниже документом, и мне нужен поиск по полю вспомогательного документа с именем brandId, имеющим значения 14 и 38.

{
    "_id" : ObjectId("5b3b206c4a25da19d05f41a2"),
    "models" : [ 
        {
            "brandId" : "14",
            "modelId" : "100",
            "brandSlug" : "honda",
            "modelSlug" : "hrv"
        }, 
        {
            "brandId" : "38",
            "modelId" : "894",
            "brandSlug" : "toyota",
            "modelSlug" : "fortuner"
        }, 
        {
            "brandId" : "38",
            "modelId" : "894",
            "brandSlug" : "toyota",
            "modelSlug" : "fortuner"
        }, 
        {
            "brandId" : "37",
            "modelId" : "773",
            "brandSlug" : "suzuki",
            "modelSlug" : "ertiga"
        } 
    ]
}

Я хочу, чтобы эти субдокументы имели brandId 14 и 38.

Желаемый выход =>

{
    "_id" : ObjectId("5b3b206c4a25da19d05f41a2"),
    "models" : [ 
        {
            "brandId" : "14",
            "modelId" : "100",
            "brandSlug" : "honda",
            "modelSlug" : "hrv"
        }, 
        {
            "brandId" : "38",
            "modelId" : "1240",
            "brandSlug" : "toyota",
            "modelSlug" : "kijang-innova"
        }, 
        {
            "brandId" : "38",
            "modelId" : "894",
            "brandSlug" : "toyota",
            "modelSlug" : "fortuner"
        } 
    ]
}

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Почему так сложно? Размотка, матч и группа сделают эту работу отлично.

db.test1.aggregate([
            {
                $unwind: {
                    path : "$models"
                }
            },
            {
                $match: {
                $or:[{"models.brandId":"14"},{"models.brandId":"38"}]
                }
            },
            {
                $group: {
                _id:"$_id",
                models:{$push:"$models"}
                }
            },
        ]
    );
0 голосов
/ 04 июля 2018

Вы можете попробовать $filter агрегирование с $or оператором

db.collection.aggregate([
  {
    "$addFields": {
      "models": {
        "$filter": {
          "input": "$models",
          "as": "model",
          "cond": {
            "$or": [
              {
                "$eq": [
                  "$$model.brandId",
                  "14"
                ]
              },
              {
                "$eq": [
                  "$$model.brandId",
                  "38"
                ]
              }
            ]
          }
        }
      }
    }
  }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...