Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.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
Javascript 如何使用聚合也包括非';不是从那个方法返回的吗?_Javascript_Node.js_Mongodb_Mongoose_Aggregation Framework - Fatal编程技术网

Javascript 如何使用聚合也包括非';不是从那个方法返回的吗?

Javascript 如何使用聚合也包括非';不是从那个方法返回的吗?,javascript,node.js,mongodb,mongoose,aggregation-framework,Javascript,Node.js,Mongodb,Mongoose,Aggregation Framework,目前,我有此功能,可检索所有页面文档中使用的所有标记文档,统计出现的次数,并将其附加到返回的每个标记文档: exports.getAll = (req, res, next) => { const config = utils.prepareOptions(req.query); async.waterfall([ (done) => { Tag.count({}).exec((err, total) => { return d

目前,我有此功能,可检索所有
页面
文档中使用的所有
标记
文档,统计出现的
次数
,并将其附加到返回的每个
标记
文档:

exports.getAll = (req, res, next) => {

  const config = utils.prepareOptions(req.query);

  async.waterfall([
    (done) => {

      Tag.count({}).exec((err, total) => {
        return done(err, total);
      });
    }
  ], (err, total) => {

    Page.aggregate([
      // {
      //   $unwind: "$tags"
      // },
      {
        $group: {
          _id: "$tags", 
          occurrences: {
            $sum: 1
          }
        }
      },
      {
        $lookup: {
          from: "tags", 
          localField: "_id", // this is supposely wrong but I can't prove it
          foreignField: "_id", 
          as: "tagsData" 
        }
      },
      {
        $unwind: "$tagsData"
      },
      { 
        $match: {
          "tagsData.label": new RegExp(config.query, 'i')
        }
      },
      {
        $project: {
          occurrences: "$occurrences",
          tagData: '$tagsData'
        }
      },
      {
        $addFields: {
          "tagData._id": "$_id", 
          "tagData.occurrences": "$occurrences" 
        } 
      }, 
      { 
        $replaceRoot: { 
          newRoot: "$tagData" 
        } 
      },
      {$sort: {[config.sortBy]: config.order}},
      {$limit: config.limit},
      {$skip: config.offset}
      ], (err, tags) => {
        console.log(tags);
        console.log(err);
        console.log(total);
        if (err) {
          return next(err);
        }

        res.json({
          error: null,
          data: tags,
          total: total,
          results: tags.length
        });
      });
  });
};
这样做的问题是,
标记
在任何给定时间都不必与
页面
一起使用。这会导致调用此函数时出现问题,因为不会返回未使用的
标记

因此,我需要做的是还包括每个未使用的
标记
,并在其上设置一个
引用:0

因此,如果我有3个
标签
文档:

[
  {_id: 1203f8sad9sf, label: 'Tag 1'},
  {_id: 1203asdf89sf, label: 'Tag 2'},
  {_id: 1203asqw89sf, label: 'Tag 3'}
]
页面
文档:

{
  _id: 90182312,
  tags: [ObjectId(1203f8sad9sf), Object(1203asdf89sf)]
}

标记1
标记2
页面
标记
数组的一部分,如果我正确理解您的意图,并且假设您已经准备好了一些代码,以确保页面的
标记
字段中没有重复的标记ID,那么如何将
标记3
返回到从
聚合
方法返回的
标记
中以更有效、更简洁的方式重写:

db.getCollection('tags').aggregate([{
    $lookup: {
        from: "page",
        localField: "_id",
        foreignField: "tags",
        as: "pageData"
    }
}, {
    $addFields: {
        "occurrences": {
            $size: "$pageData"
        }
    }
}])

那太令人沮丧了。。自从我发布这个问题以来,我一直在做各种各样的事情。我所要做的就是笑,我生命中的10个小时我再也回不来了。你这个男人。