【问题标题】:Mongoose - populate with other then idMongoose - 填充其他 id
【发布时间】:2013-03-23 17:11:36
【问题描述】:

我有这两个简化的架构,我想根据 IP 地址“加入”。

var personSchema = Schema({
  name: String,
  ip: String
});

var logSchema = Schema({
  message: String,
  ip: String
});

如果 person._id 是 IP 地址,它会起作用。但这不是我的选择。

目前我已经解决了保存新日志时的问题,我搜索人员并添加对日志的引用。然后架构是这样的:

var logSchema = Schema({
  message: String,
  ip: String,
  person: { type: Schema.Types.ObjectId, ref: 'Person' }
});

我已阅读猫鼬 Populate 文档、Document#populatedModel.populate()。我仍然不确定这是否可能。这个例子非常简单,我在日志收集上使用了 mapReduce 和分组,因此填充对我来说非常有用。

我还阅读了Database references,在我看来,唯一的选择是基于 _id 进行填充。但它是纯 mongodb,也许还有另一种使用 mongoose 的可能性?

是否可以不基于 _id 字段填充查询?

【问题讨论】:

    标签: mongoose


    【解决方案1】:

    MongoDB 不支持连接。所以.populate 只是进行另一个查询,因此对您来说最好的解决方案是手动进行另一个查询。

    【讨论】:

    • 您认为在每条日志记录中保存人员参考信息不如再进行一次查询?
    • @Mr.Pohoda 这对您没有帮助,因为您仍然需要进行单独的查询(.populate 为您完成)。而且维护这样的数据库结构将更加困难。也许我不够清楚:使用.populate 进行单独查询而不是
    • 为什么填充使用的内存比 findOne 少?我刚刚查询了 200,000 个条目(更大更容易看出差异),我的 mongod 进程在使用 populate 时从未超过 23%,但是当我使用 findOne 属性时,它几乎达到了允许的 100% 的 cpu?
    • Mongo 3.2 确实支持聚合 $lookup 这很像一个连接
    【解决方案2】:

    MongoDB 3.2 引入了 $lookup 聚合。您也可以将它与猫鼬一起使用。这是一个如何将它与条件 find 一起使用的示例:

      Log.aggregate(
          { $match: {log_property: 'value'}},
          { $lookup: {from: 'person', localField: 'ip', foreignField: 'ip', as: 'user'} }
        ).exec( function (err, logs) {
          if (err) {
            next(err);
          }
    
          res.json(logs);
        }
      );
    

    在上面的示例中,每个日志上的user 属性将使用匹配的 Person 模型文档中的人员填充

    【讨论】:

      猜你喜欢
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-06
      • 2012-01-22
      • 2016-02-20
      • 2015-10-13
      • 2019-01-31
      相关资源
      最近更新 更多