【问题标题】:Mongoose compare property array size with other propertyMongoose 将属性数组大小与其他属性进行比较
【发布时间】:2020-10-23 02:28:04
【问题描述】:

是否有可能找到一个属性(数组)的大小大于/小于其他属性(数字)的所有文档? 我们假设内部模式 numberProperty 的类型是 Number 并且数组包含 ObjectIds。

我的意思是这样的:

Collection.find({array: { $size: { $lt: numberProperty} }});

Triend 也是这样的,但也不起作用:

Collection.find({$expr: { $gt: ["$numberProperty", "$array.length"] }});

【问题讨论】:

  • 您需要与静态比较的数字吗?例如myArrayProperty.length > 3
  • 它是一个数字,但它是包含数组的同一个对象的属性,所以......它不是一个静态数字,而是一个变量。
  • 请分享示例输入和预期输出
  • 出于示例的目的,我使用了通用名称,但我只是在条件内传递了属性名称。预期的输出是对象的 ID,这就是为什么在实际应用中我添加:.distinct("_id") 只获取对象的 ID 而不是整个对象,但想法是一样的
  • 抱歉,无法理解。如果您可以分享我可以在本地数据库中插入的示例文档,然后分享我可以测试查询的预期查询结果,那就太好了。

标签: javascript node.js mongodb mongoose mongoose-schema


【解决方案1】:

你可以使用聚合

Collection.aggregate([
    { $match: { $expr: { $gt: [ {$size: "$array"}, "$numberProperty" ] } } }
]);

如果这不起作用,请尝试先将数组大小投影到新字段中,然后进行比较

Collection.aggregate([
    { $project: { arraySize: {$size: "$array"}, numberProperty: 1 } },
    { $match: { $expr: { $gt: [ "$arraySize", "$numberProperty" ] } } }
]);

希望这会有所帮助!

【讨论】:

  • 这两种方法在我的例子中似乎都不起作用:/
  • 嗯,这很奇怪。如果您从第二个选项中删除 $match 阶段,arraySize 字段是否被正确投影(具有正确的值)?
  • { $match: { $expr { $gt: [ {$size: "$array"}, "$numberProperty" ] } } }
猜你喜欢
  • 1970-01-01
  • 2022-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
相关资源
最近更新 更多