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

bqf10yzr  于 2023-11-17  发布在  Go
关注(0)|答案(5)|浏览(304)

我正在使用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。
我需要找到所有的员工,如果查询返回超过10条记录,我需要得到的部门最大没有员工。
是否可以使用Mongoose.find()来获得所需的结果?

jobtbby3

jobtbby31#

假设你的模型叫做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”属性上。该属性可以被索引,这使得它更有效。

vhipe2zx

vhipe2zx2#

由于某种原因,选择的答案现在不起作用。有**$size**operator
使用方法:

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

字符串
将查找长度为1的数组。

zzoitvuj

zzoitvuj3#

可以这样使用$where

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

字符串

zvokhttg

zvokhttg4#

Mongoose中使用虚域计算数组长度的高效方法

我最近在尝试使用Mongoose虚拟字段和预钩子检索数组长度时遇到了一个挑战。尽管数组(this.users)已正确填充并在控制台或调试器中可见,但直接尝试访问this.users.length会导致“Cannot read properties of undefined”错误。
在探索了各种选项之后,我发现了一个简单而有效的解决方案,使用三元检查:

return this.departments ? this.departments.length : null;

字符串
这种三进制检查确保数组在尝试访问其长度之前存在,从而防止错误。这种方法被证明是一种实用的方法,可以在不诉诸其他数据库查询的情况下获得用户计数。

EmployeeSchema.virtual('departmentsCount').get(function() {
    return this.departments ? this.departments.length : null;
});

f4t66c6m

f4t66c6m5#

如果任何人正在寻找数组长度大于1,你可以像下面这样做,

db.collection.find({ "arrayField.1" : { $exists: true }})

字符串
上面的查询将检查数组字段在第一个索引处是否有值,这意味着它在数组中有超过1个元素。注意:数组索引从0开始。

相关问题