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 的所有文档并对数据进行排序的主要内容,如果未能解决你的问题,请参考以下文章