MongoDB Aggregation SQL Union 和 SQL Exists like 子句
Posted
技术标签:
【中文标题】MongoDB Aggregation SQL Union 和 SQL Exists like 子句【英文标题】:MongoDB Aggregation SQL Union and SQL Exists like clause 【发布时间】:2015-06-02 21:32:01 【问题描述】:我想对这样的数据进行 MongoDB 聚合查询:
集合 A
_id : 1,
Active : true,
hasQuery : false,
Running : false,
_id : 2,
Active : true,
hasQuery : true,
Running : false,
_id : 3,
Active : true,
hasQuery : false,
Running : true,
_id : 4,
Active : true,
hasQuery : true,
Running : true,
_id : 5,
Active : false,
hasQuery : false,
Running : false,
_id : 6,
Active : false,
hasQuery : false,
Running : true,
这个 JSON 数据可以用这样的表结构来表示 表 A
PrimaryKey | Active | hasQuery | Running
1 | true | false | false
2 | true | true | false
3 | true | false | true
4 | true | true | true
5 | false | false | false
6 | false | false | true
如果我在表上应用以下查询:
select * from A where Exists(Select * from A where A.Running=true and A.hasQuery=true) and A.Running=false and A.hasQuery=false and A.Active=true
union
select * from A where not Exists(Select * from A where A.Running=true and A.hasQuery=true) and A.Running=false and A.Active=true
我得到了这些结果: 在 MongoDB 中:
_id : 1,
Active : true,
hasQuery : false,
Running : false,
_id : 2,
Active : true,
hasQuery : true,
Running : false,
_id : 5,
Active : false,
hasQuery : false,
Running : false,
在 SQL 中:
PrimaryKey | Active | hasQuery | Running
1 | true | false | false
2 | true | true | false
5 | false | false | false
如何用 mongoDB 聚合做同样的事情?
【问题讨论】:
【参考方案1】:我设法用那个代码做到了:
db.test.aggregate(
$project:
RunningActiveRecordHasQuery:
$cond: if: $and: [ "$Running", "$hasQuery", "$Active"] , then: true, else: false
,
$match:
RunningActiveRecordHasQuery : true
,
function (err, results)
if (!err )
console.log (results.result);
match=
if (results.length>0)
match.AnyNotRunningActiveRecordHavingNoQuery=true;
else
match.AnyActiveRecordNotRunning=true;
db.test.aggregate(
$project:
_id: 1,
Running : 1,
Active : 1,
hasQuery : 1,
AnyNotRunningActiveRecordHavingNoQuery:
$cond: if: $and: [ $eq: [ "$Running", false ] , $eq : [ "$hasQuery", false], "$Active"] , then: true, else: false
,
AnyActiveRecordNotRunning:
$cond: if: $and: [ $eq: [ "$Running", false ] , "$Active"] , then: true, else: false
,
$match: match
,
function (err, docs)
)
)
它使用聚合来使事情正常工作。
【讨论】:
以上是关于MongoDB Aggregation SQL Union 和 SQL Exists like 子句的主要内容,如果未能解决你的问题,请参考以下文章
Mongodb Aggregation group()分组操作
[ElasticSearch] Aggregation :简单聚合查询