两个MongoDB查询返回的文档之间的差异

时间:2015-05-02 07:01:54

标签: mongodb mongodb-query aggregation-framework

我是MongoDB和NoSQL的新手,并且有以下查询: 我在MongoDB Collection示例中有以下文档

Data Collection

{ "Name" : "A",
  "date" : "2015-04-29"
},
{ "Name" : "B",
  "date" : "2015-04-29"
},
{ "Name" : "A",
  "date" : "2015-04-30"
}

我想运行一个查询,比较日期,试图找出日期=“2015-04-30”中没有出现的名称但是出现在date =“2015-04-29”。

The result of the above query would be :
{ "Name" : "B" }

基本上尝试比较来自两个mongodb查询的结果,然后显示结果。 如果可以的话,请告诉我。

3 个答案:

答案 0 :(得分:0)

您可以使用aggregation pipeline operators执行此操作。首先,您需要使用$groupName对文档进行分组。 $push是一个累加器运算符,可用于创建date字段的数组。使用$match来查找具有给定条件的文档。

db.data.aggregate(
    [
        { "$group": { "_id": "$Name", "date": { "$push": "$date" }}},
        { "$match": { "date": { "$not": { "$all": ["2015-04-29", "2015-04-30" ]}}}}, 
    ]
)

答案 1 :(得分:0)

我会用套装实现它。

首先选择您感兴趣的元素: var need = db.a.distinct('Name', {date: '2015-04-29'})

选择你不感兴趣的元素: var doNotNeed = db.a.distinct('Name', {date: '2015-04-30'})

现在,如果您使用set(need)减去set(doNotNeed),您将获得答案。 Mongoshell不支持sets,但您可以使用词典:

var needSet = {}
for (var i=0; i < need.length; i++){
  needSet[need[i]] = 1;
}

for (var i=0; i < doNotNeed.length; i++){
  if (doNotNeed[i] in needSet){
     delete needSet[doNotNeed[i]]
  } 
}

needSet将拥有满足您查询的所有元素。您可以致电Object.keys(needSet)来获取这些内容。

答案 2 :(得分:0)

我有类似的问题,试试这个片段

var arr=[];

db.Collection.find({"date":"2015-04-30"}).forEach(function(item){
var val=item.Name;

var found=db.Collection.findOne({"date":"2015-04-29","Name":val});

if (!found)
  arr.push(val);

});

printjson(arr);