Mongoose 查找 array.length 大于 0 的所有文档并对数据进行排序

Posted

技术标签:

【中文标题】Mongoose 查找 array.length 大于 0 的所有文档并对数据进行排序【英文标题】:Mongoose find all documents where array.length is greater than 0 & sort the data 【发布时间】:2015-10-19 01:16:59 【问题描述】:

我正在使用 mongoose 在 MongoDB 上执行 CRUD 操作。这就是我的架构的外观。

var EmployeeSchema = new Schema(
      name: String,
      description: 
        type: String,
        default: 'No description'
      ,
      departments: []

    );

每个员工可以属于多个部门。部门数组看起来像 [1,2,3]。在这种情况下,departments.length = 3。如果员工不属于任何部门,departments.length 将等于 0。

我需要找到 EmployeeSchema.departments.length > 0 的所有员工,如果查询返回超过 10 条记录,我只需要获取最多部门数的员工。

是否可以使用 Mongoose.find() 来获得想要的结果?

【问题讨论】:

类似这个问题:***.com/questions/7811163/… 【参考方案1】:

假设您的模型名为Employee

Employee.find( "departments.0":  "$exists": true  ,function(err,docs) 

)

由于$exists 要求数组的0 索引,这意味着其中有一些东西。

同样适用于最大数量:

Employee.find( "departments.9":  "$exists": true  ,function(err,docs) 

)

所以需要在数组中至少有 10 个条目才能匹配。

确实,尽管您应该记录数组的长度并在每次添加内容时使用 $inc 进行更新。然后你可以这样做:

Employee.find( "departmentsLength":  "$gt": 0  ,function(err,docs) 

)

在您存储的“departmentsLength”属性上。该属性可以被索引,这使得它更加高效。

【讨论】:

奇怪,但第一个例子对我不起作用。可能这是旧解决方案不适用于新版本或其他什么?【参考方案2】:

由于某种原因,选择的答案目前不起作用。有 $size operator.

用法:

collection.find( field:  $size: 1  );

将查找长度为 1 的数组。

【讨论】:

请注意,这找到字段只有一个元素的文档。 问题说“大于0”,并不意味着大小必须正好是1。 我去了 mongodb 文档以找到对此的编辑(希望我可以使用 $gt 或其他东西)但显然 $size 从不接受范围。我希望他们在未来改变这一点。【参考方案3】:

可以像这样使用$where:

await EmployeeSchema.find( $where:'this.departments.length>0' )

【讨论】:

【参考方案4】:

如果有人在寻找数组长度大于一个值,你可以像下面这样,

db.collection.find( field :  $size:  $gt : 0  )

上面的查询会检查字段中是否至少有一个值

【讨论】:

$size 需要一个数字

以上是关于Mongoose 查找 array.length 大于 0 的所有文档并对数据进行排序的主要内容,如果未能解决你的问题,请参考以下文章

二维数组中的查找

二位数组中的查找

SUMMARY | 二分查找

折半查找法

二分查找

有序数组二分法查找