Mongodb 对于同一文档中的比较列,mongoShell查询返回的文档为零

Mongodb 对于同一文档中的比较列,mongoShell查询返回的文档为零,mongodb,mongodb-query,Mongodb,Mongodb Query,我收集了一些类似的数据结构 { id: 1 limit: { max: 10000, used: 0 } } 我尝试运行下面的查询,但结果为0 db.getCollection('promos').aggregate( [ { $match: { id: 1} }, {$match: { $expr: {$gt ["limit.max" , "limit.used"]}}} ]) 我还使用了下面的查询 db.getCollect

我收集了一些类似的数据结构

{
   id: 1
   limit: {
        max: 10000,
        used: 0     
   }
}
我尝试运行下面的查询,但结果为0

db.getCollection('promos').aggregate(
[
{ $match: { id:  1} },
{$match: { $expr: {$gt ["limit.max" , "limit.used"]}}}

])
我还使用了下面的查询

db.getCollection('promos').aggregate(
[
{ $match: { id:  1} },
{$match: { "$limit.max": {$gt: "limit.used"}}}

])

他们都没有给出结果。任何帮助都将不胜感激。

您需要在字段表达式前面加上$。这也可以简单地在.find中完成

或者,如果确实需要使用聚合,则使用单个阶段:

db.getCollection('promos').aggregate([
  { "$match": {
    "id": 1,
    "$expr": { "$gt": [ "$limit.max" , "$limit.used" ] }
  }}
])
这就是工作原理,您可以在同一查询或管道阶段将其与其他常规查询运算符混合使用

有关一般用法示例,请参见

当然,如果您实际上没有MongoDB 3.6,那么您可以使用:

或使用。适用于所有版本:

db.getCollection('promos').find({
  "id": 1,
  "$where": "this.limit.max > this.limit.used"
})

缺少表示字段表达式{$match:{$expr:{$gt:[$limit.max,$limit.used]}的$prefixes。没有这些,你只是在比较字符串,当然它们并不比提供的答案中有没有你认为不能解决你的问题的东西更大?如果是,请对答案进行评论,以澄清哪些问题需要解决,哪些问题尚未解决。如果它确实回答了您提出的问题,那么请注意您提出的问题askAssert:command failed:{ok:0,errmsg:unknown top level operator:$expr,code:2,codeName:BadValue}:aggregatefailed@made_in_india您看过文档中提到MongoDB 3.6中新增的部分了吗。您实际上需要该版本才能使用$exprIt,我的版本是3.4。4@made_in_india是的,看来您应该先阅读文档。阅读上面的其他解决方案,它们实际上适用于您的MongoDB版本。我尝试了$redact,但当我使用$gt时,它会给我0个文档,当我使用'$lt'时,它会给我所需的文档。看到这种行为真令人惊讶
db.getCollection('promos').aggregate([
  { "$match": { "id": 1 } },
  { "$redact": {
    "$cond": {
      "if": { "$gt": [ "$limit.max" , "$limit.used" ] },
      "then": "$$KEEP",
      "else": "$$PRUNE"
    }
  }}
])
db.getCollection('promos').find({
  "id": 1,
  "$where": "this.limit.max > this.limit.used"
})