【发布时间】:2016-03-18 01:34:16
【问题描述】:
我正在处理一个查询,该查询从我的 mongo 数据库中的 2 个不同的 obj 引用中读取。我将使用一个简单的例子来说明我在寻找什么。
我有 3 个架构:
User = new Schema({
places:[{type: Schema.Types.ObjectId, ref:'Place'}],
shouts:[{type: Schema.Types.ObjectId, ref:'Shout'}]
});
Place = new Schema({
name:String,
description:String,
});
Shout = new Schema({
content:String,
});
我最大的问题是 mongoose 或 mongodb 在执行聚合方法时是否可以访问 objectId 引用。请允许我详细说明。
module.exports.askForShoutInPlace = function(req, res){
var pname = new RegExp(req.params.pname, 'i');
User.aggregate(
[
{'$match':{ 'places':{
'$elemMatch':{'name':pname}
}
},
{'$project':{ shout:'$shouts'} },
{'$unwind':'$shouts'},
{'$group':{_id:'$shouts'}}
]).exec(function(err, results){
res.send(results);
});
}
这通常可以正常工作,但是一旦调用 $match 运算符,我就会得到一个空数组,我猜它与返回未定义子对象的对象引用有关。有什么解决办法吗?或者这是否意味着我必须采取另一条路线来雇用人口?
提前感谢大家的帮助
【问题讨论】:
-
您可能想阅读 - mongoosejs.com/docs/populate.html。您需要在客户端解析引用。 Mongoose 使用
populate功能为您做这件事。aggregation代码在服务器端执行,因此不会自动解析引用。 -
感谢@BatScream 的回复,这只是一个了解错误基本原理的示例,我正在使用地理空间索引,因此在客户端解决这个问题可能比需要的更难。假设,如果子模式将引用父模式,您是否说可以聚合子模式,填充父模式并在将结果发送给客户端之前进行过滤?或者这会被证明是一个糟糕的性能瓶颈?
标签: node.js mongodb mongoose aggregation-framework