具有键值对搜索的MongoDB标签

时间:2018-06-30 09:27:40

标签: mongodb mongodb-query database-metadata

我有一个mongo集合“ CARDS”,其中包含标签对象列表。 (种类的元数据)

"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 :1tags.tagValue: 1

现在,我想从带有某些tagName的标签中进行搜索,这些tagName的值包含一些必需的值和一些可选的值 即AND / OR的混合 就像

{{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:{         $ or:[           {tagName:'CITY',tagValue:'delhi'},           {tagName:'COUNTRY',tagValue:'in'}         ]       }}});

现在无法将两者结合起来并满足我的要求。我是MongoDB的新手,也是mongo的第一个项目。请帮忙达到我的要求?或任何其他实现这些目标的策略。

1 个答案:

答案 0 :(得分:0)

如果我正确理解了这个问题,那么下面的查询将帮助您满足您的要求。

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