$ elemMatch и $ in.запрос для массива документов - PullRequest
0 голосов
/ 30 мая 2018

с коллекцией (productList) и документом, как показано ниже:

    {   "_id":"1",
        "product_name" : "Haier 240l",
        "version" : "1.0",
        "filterInfo" : [ 
            {
                "name" : "brand",
                "value" : "Haier"
            }, 
            {
                "name" : "energy_rating",
                "value" : "4 Star"
            }
         ]
    }
    {   "_id":"2",
        "product_name" : "Haier 310l",
        "version" : "1.0",
        "filterInfo" : [ 
            {
                "name" : "brand",
                "value" : "Haier"
            }, 
            {
                "name" : "energy_rating",
                "value" : "3 Star"
            }
         ]
    }

    {   "_id":"3",
        "product_name" : "Samsung 275l",
        "version" : "1.0",
        "filterInfo" : [ 
            {
                "name" : "brand",
                "value" : "Samsung"
            }, 
            {
                "name" : "energy_rating",
                "value" : "3 Star"
            }
         ]
    }
 {   "_id":"4",
        "product_name" : "Lg 254l",
        "version" : "1.0",
        "filterInfo" : [ 
            {
                "name" : "brand",
                "value" : "Lg"
            }, 
            {
                "name" : "energy_rating",
                "value" : "3 Star"
            }
         ]
    }

Я хочу получить весь документ с (i), брендом: Haier и energy_rating: 3
И (ii) марка: Haier или марка: Samsung и energy_rating: 3
Для (i) я попытался, используя elemMatch ниже запросов:

db.productList.find({filterInfo: { $elemMatch: {'name':{$in:['brand','enery_rating']},'value':{$in:['Samsung','3 Star']}}}})

db.getCollection('productList').find({'filterInfo': {$elemMatch: { 'value':'Samsung', 'value' :'3 Star'} }  })

db.getCollection('productList').find({'filterInfo': {$elemMatch: {   $and:[ {'name':'brand', 'value' :'Samsung'}, {'name':'energy_rating', 'value':'3 Star' } ]} }    }) 

db.getCollection('productList').find({'filterInfo': {$elemMatch: {  'name':'brand', 'value' :'Samsung', 'name':'energy_rating', 'value':'3 Star'} }    })

Но ни один из них не работает правильно.Я здесь неправильно делаю некоторые бацисы (новичок здесь).

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Нет необходимости в $elemMatch в этом, я бы сказал.

Первый запрос

db.productList.find({
   $and:[
         {'filterInfo.value':'Haier'},
         {'filterInfo.value':'3 Star'}
        ]
});

Второй запрос

db.productList.find({
   $and:[
         {'filterInfo.value':{
            $in:['Haier','Samsung']}
         },
         {'filterInfo.value':'3 Star'}
        ]
});

Сконцентрируйтесь больше на структурировании данных вMongoDB для оптимизированной производительности.Я не знаю логику вашего приложения, но нужно ли хранить все эти данные в массиве.Я не вижу необходимости в этом, когда вы можете хранить данные простыми, например JSON 1 , или если вы конкретно относитесь к filterInfo, ключ может быть сконструирован как JSON 2 .

JSON 1

{
    "_id" : "1",
    "product_name" : "Haier 240l",
    "version" : "1.0",
    "brand":"Haier",
    "energy_rating":"4 Star"
}

JSON 2

 {
        "_id" : "1",
        "product_name" : "Haier 240l",
        "version" : "1.0",
        "filterInfo": {
            "brand":"Haier",
            "energy_rating":"4 Star"
            }
 }
0 голосов
/ 30 мая 2018

Первый запрос

db.productList.find({
  "$and":[
    {"filterInfo":{"$elemMatch":{"name":"brand","value":"Haier"}}},
    {"filterInfo":{"$elemMatch":{"name":"energy_rating","value":"3 Star"}}}
  ]
})

Вы можете упростить первый запрос, используя $all with $elemMatch для выполнения запросов к массивам.

db.productList.find({
  "filterInfo":{
    "$all":[
      {"$elemMatch":{"name":"brand","value":"Haier"}},
      {"$elemMatch":{"name":"energy_rating","value":"3 Star"}}
    ]
  }
})

Второй запрос

db.productList.find({
  "$and":[
    {"$or":[
      {"filterInfo":{"$elemMatch":{"name":"brand","value":"Samsung"}}},
      {"filterInfo":{"$elemMatch":{"name":"brand","value":"Haier"}}}
    ]},
    {"filterInfo":{"$elemMatch":{"name":"energy_rating","value":"3 Star"}}}
  ]
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...