【发布时间】:2018-04-02 23:22:03
【问题描述】:
我有一个看起来像这样的数据集:
{"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"}
我想要一个返回具有 status="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']}}]})
我只需要能够在方括号内写一个 find 即可。我可以这样做:
var res=[];
res = db.test2.distinct("key", {"status": "p"});
db.test2.find({$and: [{"status":"np"}, {"key": {$nin:res}}]});
但是这样做的问题是,在两次查询之间,另一个进程可能会更新文档的“状态”,然后我会得到不一致的数据。
【问题讨论】:
-
也许你可以尝试使用聚合。 1.按键分组。 2. $elemMatch 过滤状态
标签: mongodb mongodb-query aggregation-framework