猫鼬 - 填充其他然后id

时间:2013-04-02 12:01:24

标签: mongoose

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

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

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

如果person._id是ip地址,那将会有效。但这对我来说不是一个选择。

目前我已经解决了这个问题,就像保存新日志的时候一样,我搜索人并添加对日志的引用。 Schema就像这样:

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

我已阅读过mongoose Populate文档,Document#populatedModel.populate()。我还不确定是否可能。这个例子非常简单,我使用mapReduce和日志集合分组,因此人口对我来说很棒。

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

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

2 个答案:

答案 0 :(得分:1)

MongoDB不支持联接。因此.populate只会进行另一次查询,因此最适合您的方法是手动进行另一次查询。

答案 1 :(得分:1)

MongoDB 3.2引入了$ lookup聚合。您也可以使用mongoose。这是一个如何将它与条件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模型文档中的人填充