MongoDB -将字段值与数组大小进行比较

5f0d552i  于 2023-02-18  发布在  Go
关注(0)|答案(2)|浏览(203)

我尝试返回所有满足document.field.value > document.array.length的文档。我尝试使用ExpressJS中的MongoClient来完成此操作,但无法在SO上找到答案。
这是我尝试过的,但这给出了一个空列表。

const db = ref()
const c = db.collection(t)
const docs = await c.find({ 
                "stop.time":{$gt: new Date().toISOString()},
                "stop.expect": {$gt: { $size: "stop.riders"}}
            })
console.log(docs)

还尝试更换

"stop.expect": {$gt: { $size: "stop.riders"}}

下面的代码无法编译

$expr: {$lt: [{$size: "stop.riders"}, "stop.expect"]}

样本数据:

{ "stop": { "expect":3, "riders": ["asd", "erw", "wer"] } },
{ "stop": { "expect":4, "riders": ["asq", "frw", "wbr"] } }
2mbi3lxu

2mbi3lxu1#

要使用涉及计算的复杂查询筛选查询,需要使用$expr运算符,它允许使用聚合运算符。
接下来,在$expr运算符中,要引用字段,需要添加前缀$

db.collection.find({
  $expr: {
    $lt: [
      {
        $size: "$stop.riders"
      },
      "$stop.expect"
    ]
  }
})

Demo @ Mongo Playground

lrpiutwd

lrpiutwd2#

要比较文档中的字段,必须使用$expr,如下所示:

const docs = await c.find({ 
  $expr: { $gt: ["$stop.expect", { $size: "$stop.riders" }] },
});

我省略了stop.time条件,因为它不在您的示例数据中,并且不清楚它是什么类型的字段,如果它确实在您的数据中(它是Date还是String将非常重要)。
请注意,这种查询不能使用索引。

相关问题