如何编写mongoose查询来过滤子文档
我有一个叫做“Users”的Mongoose模式,它有一个“Roles”子文档作为其variables之一,如下所示:
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 } });
我想创build一个Mongoose查询,将查找所有users.names为“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); });
有人能告诉我我的逻辑错在哪里吗?
用单个查询来查询多个集合是不可能的。 如果Role
是User
embedded的子文档,那么您可以对roles.name
执行查询,但目前不支持,因为它是在User
引用的单独集合。
但是,解决方法是在查询返回后添加另一个筛选步骤,手动筛选出没有任何与填充条件匹配的angular色的文档,但首先您需要在填充中使用匹配查询,而不是在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); });
这是内置于Mongoose populate()
这里 。 你可以简单地构造一个这样的查询:
var roles = ["owner", "admin"]; User.find() .populate({ path: 'roles', match: { name: { $in: roles }}, select: 'name' }) .sort({'_id': 1}) .exec(function (err, users) { res.send(users); });