Node.js Mongoose子字段聚合,包含全文搜索和项目
我有一个名为Session的猫鼬模型,其中一个字段名为course(coursemodel),我想对sessions进行全文搜索,另外,我想使用课程子字段中的字段聚合结果,并选择一些字段,如课程,日期,等等。 我尝试了以下方法:Node.js Mongoose子字段聚合,包含全文搜索和项目,node.js,mongodb,mongoose,aggregation-framework,Node.js,Mongodb,Mongoose,Aggregation Framework,我有一个名为Session的猫鼬模型,其中一个字段名为course(coursemodel),我想对sessions进行全文搜索,另外,我想使用课程子字段中的字段聚合结果,并选择一些字段,如课程,日期,等等。 我尝试了以下方法: Session.aggregate( [ { $match: { $text: { $search: 'web' } } }, { $unwind:
Session.aggregate(
[
{
$match: { $text: { $search: 'web' } }
},
{ $unwind: '$course' },
{
$project: {
course: '$course',
date: '$date',
address: '$address',
available: '$available'
}
},
{
$group: {
_id: { title: '$course.title', category: '$course.courseCategory', language: '$course.language' }
}
}
],
function(err, result) {
if (err) {
console.error(err);
} else {
Session.deepPopulate(result, 'course course.trainer
course.courseCategory', function(err, sessions) {
res.json(sessions);
});
}
}
);
我的模型:
- 会议
- 课程
任何形式的帮助都将不胜感激。您可以在下面尝试
您缺少通过将课程对象id从会话文档连接到课程文档中的id来提取课程文档所需的
$lookup
$project
将所需字段保留在输出中
Session.aggregate([
{
"$match": {
"$text": {
"$search": "web"
}
}
},
{
"$lookup": {
"from": "courses",
"localField": "course",
"foreignField": "_id",
"as": "course"
}
},
{
"$project": {
"course": 1,
"date": 1,
"address": 1,
"available": 1
}
}
])
课程是一个包含一个课程文档的数组。您可以使用$arrayElemAt
投影文档
"course": {"$arrayElemAt":["$course", 0]}
您缺少通过将课程对象id从会话文档连接到课程文档中的id来提取课程文档所需的
$lookup
。在$match
和$unwind
阶段之间插入查找阶段。类似于{$lookup:{from:“course”,localField:“course”,foreignField:“\u id”,as:“course”}
。调整以使用正确的集合名称、本地字段和外部字段。@Veeram我遇到了以下错误:MongoError:exception:无法识别的管道阶段名称:“$lookup”
如果合理的话,我的mongoose版本是^4.11.12。$lookup
阶段是在3.2 mongo服务器中添加的。看起来您不在3.2版本上。转到mongo shell并运行db.version()
进行验证。@Veeram mongo版本2.6.11它工作正常,但添加$match时除外,即使使用了真实的条件,例如:`{$match:{'available':true}}}`当您将“available”添加到match阶段时,是否意味着它不工作?类似于{“$match”:{“$text”:{“$search”:“web”},“available”:true}
应该可以工作。不,即使只有{“$match”:{“available”:true}
实际上也不能工作,即使在输出中我也无法获得可用属性这很难推测。只需检查您的文档并确保它与您要查找的内容相匹配。可能是字符串“true”值。如果问题仍然存在,请考虑创建一个单独的问题与所有细节。
Session.aggregate([
{
"$match": {
"$text": {
"$search": "web"
}
}
},
{
"$lookup": {
"from": "courses",
"localField": "course",
"foreignField": "_id",
"as": "course"
}
},
{
"$project": {
"course": 1,
"date": 1,
"address": 1,
"available": 1
}
}
])
"course": {"$arrayElemAt":["$course", 0]}