我有这两个简化的架构,我想根据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#populated和Model.populate()。我还不确定是否可能。这个例子非常简单,我使用mapReduce和日志集合分组,因此人口对我来说很棒。
我还阅读Database references,在我看来,唯一的选择是基于_id填充。但它是纯粹的mongodb,也许还有另一种使用猫鼬的可能性?
是否可以不基于_id字段填充查询?
答案 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模型文档中的人填充