Mongoose找到array.length大于0&对数据进行排序

时间:2015-07-28 12:59:12

标签: node.js mongodb mongoose mongodb-query

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

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

    });

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

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

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

4 个答案:

答案 0 :(得分:15)

假设您的模型名为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) {

})

在"部门长度"你存储的财产。该属性可以编入索引,这样可以提高效率。

答案 1 :(得分:7)

由于某些原因,所选答案目前无法正常运行。有 $ size operator

用法:

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

将查找长度为1的数组。

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

可以像这样使用$where

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