gpt4 book ai didi

node.js - mongoose/mongodb 在聚合期间是否可以访问模式中的对象引用?

转载 作者:可可西里 更新时间:2023-11-01 10:25:43 26 4
gpt4 key购买 nike

我正在处理一个查询,该查询从我的 mongo 数据库中的 2 个不同的对象引用中读取。我将使用一个简单的例子来说明我在寻找什么。

我有 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 运算符被调用,我得到一个空数组,我猜它与返回未定义子对象的对象引用有关。有什么解决办法吗?或者这是否意味着我必须采取另一条途径来雇用填充?

提前感谢所有帮助

最佳答案

在聚合过程中无法访问对象引用数据,我为我的项目采用的解决方法是在相关模式中添加对所有者的引用。

User = new Schema({
places:[{type: Schema.Types.ObjectId, ref:'Place'}],
shouts:[{type: Schema.Types.ObjectId, ref:'Shout'}]
});
Place = new Schema({
owner:{type: Schema.Types.ObjectId, ref:'Place'},
name:String,
description:String,
});
Shout = new Schema({
owner:{type: Schema.Types.ObjectId, ref:'Place'},
content:String,
});

然后直接在子文档上进行聚合以获得拥有地点实例的唯一用户,这样我可以获得匹配查询和地点的呼喊结果。

例子:

module.exports.askForShoutInPlace = function(req, res){
var pname = new RegExp(req.params.pname, 'i');
var stringQ = new RegExp(req.paramos.qcontent, 'i');
Place.aggregate(
[
//find Places that match criteria
{'$match':{'name':pname}},
//select owner id object to result
{'$project':{ owner:'$owner'}},
//group those results to single array with unique ids of users
{'$group':{_id:'$owner'}}
]).exec(function(err, results){
//find user shouts that match string and belong to owners know to be owners of a place
Shout.find({'content':stringQ}).where({'owner':{'$in':results}}).exec(function(err, shouts){
res.send(shouts);
});
});

}

这正是我发现的解决我的特殊需求的方法,我希望它能对某人有所帮助。

关于node.js - mongoose/mongodb 在聚合期间是否可以访问模式中的对象引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34235382/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com