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)
有人可以告诉我我的逻辑错在哪里吗?
一次查询不可能查询多个集合。如果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)