小编典典

在填充猫鼬后查找

node.js

我在用猫鼬填充后无法通过在文档内部匹配的值来查询文档。

我的架构是这样的:

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;
        });

有没有办法从猫鼬直接查询类似的东西?


阅读 219

收藏
2020-07-07

共1个答案

小编典典

@Jason Cust 已经很好地解释了它-
在这种情况下,通常最好的解决方案是更改架构,以防止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

剩下的全部都.filter放在返回的users数组上,就像在您最初的问题中一样-仅使用更简单,非常通用的检查。如您所见-
email存在或不存在。

2020-07-07