【问题标题】:Is it possible to do a subquery to return an array for the $nin operator in MongoDB?是否可以进行子查询以返回 MongoDB 中 $nin 运算符的数组?
【发布时间】: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


【解决方案1】:

试试这个

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}}
]);

【讨论】:

  • 关闭,但不会检索到实际文档。
  • 你只需要在$project阶段添加你想要的字段
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 2011-04-01
  • 2023-03-23
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多