我的数据集类似于:
{"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;一个文件,然后我有不一致的数据。
答案 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}}
]);