来自mongoDB中一个集合的组合查询

时间:2014-06-18 19:51:07

标签: mongodb

我有一个具有以下结构的集合。

{
     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组合在一起,但失败了。 我有兴趣获得最佳性能的解决方案。

谢谢,

1 个答案:

答案 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”,其他条件可以是匹配的其他条件之一。

所以这取决于你打算如何“束缚”你的逻辑,但这些是必不可少的方法。