3

我有这两个简化的架构,我想根据 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' }
});

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

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

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

4

2 回答 2

1

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

于 2013-04-02T13:58:27.870 回答
1

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 模型文档中的人员填充

于 2016-03-15T20:53:03.707 回答