如何编写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); }); 

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

用单个查询来查询多个集合是不可能的。 如果RoleUserembedded的子文档,那么您可以对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); });