我有一个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 :1
和tags.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的第一个项目。请帮忙达到我的要求?或任何其他实现这些目标的策略。
答案 0 :(得分:0)
如果我正确理解了这个问题,那么下面的查询将帮助您满足您的要求。
db.things.find( {
$and : [
{
$or : [
{"tagName" : "CITY", "tagValue" : "delhi"},
{"tagName": "COUNTRY", "tagValue" : "in" }
]
},
{ "tagName" : "COUNTRY", "tagValue" : "in" },
{"tagName" : "LOCATION_AREA", "tagValue" : "t1"}
]
} )