我在用猫鼬填充后无法通过在文档内部匹配的值来查询文档。
我的架构是这样的:
var EmailSchema = new mongoose.Schema({ type: String }); var UserSchema = new mongoose.Schema({ name: String, email: [{type:Schema.Types.ObjectId, ref:'Email'}] });
我想让所有用户拥有例如类型为“ Gmail”的电子邮件。
以下查询返回空结果:
Users.find({'email.type':'Gmail').populate('email').exec( function(err, users) { res.json(users); });
我不得不像这样过滤JS中的结果:
users = users.filter(function(user) { for (var index = 0; index < user.email.length; index++) { var email = user.email[index]; if(email.type === "Gmail") { return true; } } return false; });
有没有办法从猫鼬直接查询类似的东西?
@Jason Cust 已经很好地解释了它- 在这种情况下,通常最好的解决方案是更改架构,以防止Users通过存储在单独集合中的文档的属性进行查询。
Users
不过,这是我能想到的最佳解决方案,不会强迫您这样做(因为您在评论中说不能)。
Users.find().populate({ path: 'email', match: { type: 'Gmail' } }).exec(function(err, users) { users = users.filter(function(user) { return user.email; // return only users with email matching 'type: "Gmail"' query }); });
我们在这里所做的只是填充emails匹配其他查询(调用中的match选项.populate()),否则文档中的email字段Users将设置为null。
email
match
.populate()
null
剩下的全部都.filter放在返回的users数组上,就像在您最初的问题中一样-仅使用更简单,非常通用的检查。如您所见- email存在或不存在。
.filter
users