是否可以在MongoDB中为$ nin运算符返回一个子查询?

时间:2018-04-02 23:22:04

标签: mongodb mongodb-query aggregation-framework

我的数据集类似于:

{"key": "abc", "val": 1, "status": "np"}
{"key": "abc", "val": 2, "status": "p"}
{"key": "def", "val": 3, "status": "np"}
{"key": "ghi", "val": 4, "status": "np"}
{"key": "ghi", "val": 5, "status": "p"}

我想要一个返回状态=" np"的文档的查询但只有当其他文件具有相同的密钥且状态值不为" p"时。因此,从上面的数据集返回的文档将是key =" def"因为" abc"的值为" np"但是" abc"还有一个值为" p"的文档。对于key =" ghi"也是如此。我想出了一些接近但我不认为$ nin运算符支持q distinct查询。

db.test2.find({$and: [{"status":"np"}, {"key": {$nin:[<distinct value query>]]})

如果我要对$ nin数组中的值进行硬编码,它将起作用:

db.test2.find({$and: [{"status":"np"}, {"key": {$nin:['abc', 'ghi']}}]})

我只需要能够在方括号内写一个查找。我可以做类似的事情:

var res=[];
res = db.test2.distinct("key", {"status": "p"});
db.test2.find({$and: [{"status":"np"}, {"key": {$nin:res}}]});

但问题在于,在两个查询之间的时间内,另一个进程可能会更新&#34; status&#34;一个文件,然后我有不一致的数据。

1 个答案:

答案 0 :(得分:0)

试试这个

db.so.aggregate([
 {$group: {'_id': '$key', 'st': {$push: '$status'}}},
 {$project :{st: 1, '$val':1, '$status':1, 'hasNp':{$in:['np', '$st']}, hasP: {$in:['p', '$st']}}},
 {$match: {hasNp: true, hasP: false}}
]);