在mongoose填充后,通过文档中匹配的值查询文档时遇到了一些问题.

我的模式是这样的:

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

有没有办法直接从mongoose 那里查询类似的东西?

推荐答案

@Jason Cust已经很好地解释了这一点——在这种情况下,最好的解决方案通常是修改模式,以防止通过存储在单独集合中的文档的属性查询Users.

不过,我能想到的最佳解决方案是,这不会迫使你这么做(因为你在 comments 中说你不能这么做).

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

我们在这里做的是只填充email个匹配额外查询的字段(.populate()调用中的match选项)——否则Users个文档中的email个字段将设置为null.

只剩下返回的users数组上的.filter,就像你最初的问题一样——只需要进行更简单、更通用的判断.正如你所看到的,email要么在那里,要么不在那里.

Mongodb相关问答推荐

MongoDB:用特殊字符创建的drop collection

geoLocation或geoNear为坐标和半径使用let变量

MongoDB对两个串联数组进行排序

如何在 MongoDB 中的集合下查找同一文档

在数据中只有月份和年份的 mongodb 中字符串的日期时间

使用MongoDB作为我们的主数据库,我应该使用单独的图数据库来实现实体之间的关系吗?

MongoDB映射/减少多个集合?

在 Nodejs 中找不到模块

Mongoose:填充填充字段

MongoDB Java API:put() 与 append()

mongo - Ruby连接问题

Flask:设置应用程序和请求特定的属性?

如何向 mongodb 2.6 添加身份验证?

Mongodb 设计,嵌入与关系

从 nodejs 到 mongodb 或 mongoose 的动态数据库连接

python + pymongo:如何从 for 循环中在 mongo 中的现有文档上插入新字段

我如何将 mongodb 与electron一起使用?

为什么 Mongo 提示会使查询运行速度提高 10 倍?

我可以使用字符串作为 mongodb 文档的 ID 类型吗?

MongoDB 引用的最佳实践