MongoDB теги с поиском пары ключ-значение - PullRequest
0 голосов
/ 30 июня 2018

У меня есть коллекция КАРТ монго со списком объектов тегов. (вид метаданных)

"tags" : [
        {
            "tagValue" : "retail", 
            "tagName" : "CARD_TYPE"
        },
        {
            "tagValue" : "fast food ", 
            "tagName" : "CARD_SUB_TYPES"
        }, 
        {
            "tagValue" : "ghy", 
            "tagName" : "LOCATION"
        }, 
        {
            "tagValue" : "t1", 
            "tagName" : "LOCATION_AREA"
        }, 
        {
            "tagValue" : "guest", 
            "tagName" : "LOCATION_AREA_TYPE"
        }, 
        {
            "tagValue" : "departure", 
            "tagName" : "LOCATION_AREA_WAY"
        },
        { 
            "tagName" : 'CITY', 
            "tagValue" : 'delhi' 
        }
    ],

Теперь я хочу найти документы из коллекции на основе этих тегов. Может быть любое количество объектов тегов с ключом (tagName) и значением (tagValue). Кроме того, может быть несколько документов с одним и тем же tagName с другим значением. Я проиндексировал теги как tags.tagName :1 и tags.tagValue: 1

Теперь я хочу выполнить поиск по этим тегам, где некоторые теги имеют значения с некоторыми обязательными, а некоторые с необязательными то есть смешивание И / ИЛИ например, где

{{tagName:LOCATION AND tagValue:ghy} AND {tagName:LOCATION_AREA AND tagValue:t1}}
OR {{tagName:CITY AND tagValue:delhi} AND { tagName: 'COUNTRY', tagValue: 'in' }}
OR { tagName: 'ANYTHING', tagValue: 'any_value' } ..

Я запросил, где все необходимые значения должны быть представлены как

.find ({теги: { $ all: [ {$ elemMatch: {tagName: 'LOCATION', tagValue: 'ghy'}}, {$ elemMatch: {tagName: 'LOCATION_AREA', tagValue: 't1'}} ]}});

и пробовал это по желанию

.find ({теги: { $ elemMatch: { $ или: [ {tagName: 'CITY', tagValue: 'delhi'}, {tagName: 'COUNTRY', tagValue: 'in'} ] }}});

Теперь не в состоянии объединить эти два и выполнить мои требования. Я новичок в MongoDB и первый проект с Монго. Пожалуйста, помогите достичь моего требования? ИЛИ любая другая стратегия для достижения этих целей.

1 Ответ

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

если я правильно понял вопрос, то запрос ниже поможет вам, каково ваше требование.

db.things.find( {
      $and : [
               { 
                 $or : [ 
                         {"tagName" : "CITY", "tagValue" : "delhi"},
                         {"tagName": "COUNTRY", "tagValue" : "in" }
                       ]
               },
               { "tagName" : "COUNTRY", "tagValue" : "in" },
               {"tagName" : "LOCATION_AREA", "tagValue" : "t1"} 
             ]
    } )
...