我有一个具有以下结构的集合。
{
sourceName: ’mySourceName1’,
date: ‘October’,
metadata:[
{‘key’: ‘userName’, ‘value’ : ‘user1’},
{‘key’: ‘instrumentName’, ‘value’ : ‘instrument1’}
]}
{
sourceName: ’mySourceName2’,
date: ‘November’,
metadata:[
{‘key’: ‘userName’, ‘value’ : ‘user2’},
{‘key’: ‘instrumentName’, ‘value’ : ‘instrument2’}
]}
如何进行如下查询:
Select * from Data where sourceName in (‘mySourceName1’, ’mySourceName2’) and (key=’userName’ and value=’user1’) and (key=’..’ and value = ‘..’) ….
我设法通过以下方式进行查询,除了'in'部分:
$all:[{$elemMatch:{‘key’:’userName’, ‘value’: ‘user1’}},{$elemMatch:{‘key’: ‘instrumentName’, ‘value’: ‘instrument2’}]
如何添加'in'部分?我需要进行两次查询吗?我尝试将$ all和$ in组合在一起,但失败了。 我有兴趣获得最佳性能的解决方案。
谢谢,
答案 0 :(得分:0)
MongoDB有一个$in
运算符,但根据您查询的具体用例,您需要的是$or
运算符。这样做是为了匹配逻辑语句,这是$in
以简化的方式做的事情:
db.collection.find({
"$or": [
{
"sourceName": "mySourceName1",
"metadata": {
"$all": [
{ "$elemMatch": {
"key": "userName", "value": "user1"
}},
{ "$elemMatch": {
"key": "instrumentName", "value": "instrument1"
}}
]
}
},
{
"sourceName": "mySourceName2",
"metadata": {
"$all": [
{ "$elemMatch": {
"key": "userName", "value": "user2"
}},
{ "$elemMatch": {
"key": "instrumentName", "value": "instrument2"
}}
]
}
}
]
})
实际上,这是一个很大的“in”语句,您要提供匹配的标准集。
如果您确实打算不将这些“sourceName”值“绑定”到其他匹配条件,那么您实际上也可以使用$in
运算符来编写它:
db.collection.find({
"sourceName": { "$in": [ "mySourceName1", "mySourceName2" ] },
"$or": [
{
"metadata": {
"$all": [
{ "$elemMatch": {
"key": "userName", "value": "user1"
}},
{ "$elemMatch": {
"key": "instrumentName", "value": "instrument1"
}}
]
}
},
{
"metadata": {
"$all": [
{ "$elemMatch": {
"key": "userName", "value": "user2"
}},
{ "$elemMatch": {
"key": "instrumentName", "value": "instrument2"
}}
]
}
}
]
})
由于所有MongoDB查询都是隐式“和”条件,这表示“sourceName”可以是“mySourceName1”或“mySourceName2”,其他条件可以是匹配的其他条件之一。
所以这取决于你打算如何“束缚”你的逻辑,但这些是必不可少的方法。