如何编写猫鼬查询来过滤子文档

Jas*_*man 3 javascript mongoose mongodb node.js

我有一个名为“ Users”的猫鼬模式,其中有一个“ Roles”子文档作为其变量之一,如下所示:

var UserSchema = new mongoose.Schema({
    email: { type: String, required: true, unique: true },
    password: { type: String, required: true },
    roles: [ { type: Number, ref: 'Role' } ]
});

var RoleSchema = new mongoose.Schema({
    _id: Number,
    name: { type: String, required: true, unique: true },
    description: { type: String, required: true }
});
Run Code Online (Sandbox Code Playgroud)

我想创建一个Mongoose查询,该查询将找到所有Roles.name为“ admin”或“ owner”的用户。我曾尝试使用此查询,但我认为该查询会起作用,但使用该where...in零件时没有任何用户。

var roles = ["owner", "admin"];
User.find()
    .populate('roles')
    .where('roles.name').in(roles)
    .sort({'_id': 1})
    .exec(function (err, users) {
        res.send(users);
    });
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我我的逻辑错在哪里吗?

chr*_*dam 5

一次查询不可能查询多个集合。如果Role是嵌入的子文档,User则可以对其进行查询,roles.name但目前不支持该查询,因为它是中引用的一个单独的集合User

但是,一种解决方法是在查询返回后添加另一个过滤器步骤,以手动过滤出没有任何角色与填充条件匹配的文档,但是首先您需要在填充中使用匹配查询而不是where方法:

var roles = ["owner", "admin"];
User.find()
    .populate('roles', null, { name: { $in: roles } } )
    .sort({'_id': 1})
    .exec(function (err, users) {
        users = users.filter(function(user){
            return user.roles.length;
        });
        res.send(users);
    });
Run Code Online (Sandbox Code Playgroud)

  • @chridam,您能建议我如何对此应用分页吗? (2认同)