Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongoose子字段聚合,包含全文搜索和项目_Node.js_Mongodb_Mongoose_Aggregation Framework - Fatal编程技术网

Node.js Mongoose子字段聚合,包含全文搜索和项目

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猫鼬模型,其中一个字段名为coursecoursemodel),我想对sessions进行全文搜索,另外,我想使用课程子字段中的字段聚合结果,并选择一些字段,如课程日期,等等。 我尝试了以下方法:

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);
            });
            }
        }
    );
我的模型:

  • 会议
  • 课程
我不确定我所尝试的是否能满足我的需求,我遇到了与$unwind操作符有关的错误:

MongoError:异常:$unwind字段路径“$course”末尾的值 必须是数组,但为OID


任何形式的帮助都将不胜感激。

您可以在下面尝试


您缺少通过将课程对象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]}