node.js - Mongoose - foreach 循环与聚合结果

标签 node.js mongodb mongoose mean-stack

我使用带有 mongoose 插件的 Node.js 来构建带有任务的简单应用程序。我的 mongoDB 架构如下所示:

var userSchema = mongoose.Schema({

    username: String,
    email  : String,
    password : String,
    tasks: [{
      title: String,
      description: String,
      date: {type: Array, "default":[]}, 
      currentPeriod: Number,  
      periodQuantity: Number,
      done: Boolean
    }]

});

我想要做的是(例如)获取任务,其中“done”变量设置为 true,并且是一个用户(同一文档)的一部分。目前,我的查询如下所示:

    User.aggregate({$match:{'email':req.user.email}},{$unwind:"$tasks"},{$match:{'tasks.done':true}},{$project:{'tasks':1,'_id':0}}, function(err,tasks){
      if (err) {
        console.log('Something went wrong during getting inactive task(s) for user "' + req.user.email + '": ' + err);
        res.send(err);
      }
      console.log('Succesfully got ' + tasks.length + ' inactive task(s) for user: "' + req.user.email + '".');
      res.json(tasks);
    });

问题是这样的查询结果是这样的

    [
    {"tasks":{"_id":"57372ef07329d9d8f2921ede","title":"Done1","description":"Done1Desc","currentPeriod":3,"periodQuantity":3,"done":true}},
    {"tasks":{"_id":"57372ef07329d9d8f2921edf","title":"Done2","description":"Done2Desc","currentPeriod":11,"periodQuantity":11,"done":true}},
    {"tasks":{"_id":"57372ef07329d9d8f2921ee3","title":"Done3","description":"Done3Desc","currentPeriod":3,"periodQuantity":3,"done":true}},
    {"tasks":{"_id":"57372ef07329d9d8f2921ee4","title":"Done4","description":"Done4Desc","currentPeriod":4,"periodQuantity":4,"done":true}}
    ]

虽然我只想要“属性”任务的值。我设法使用

在 mongo 控制台中获得了我感兴趣的结果
> var results = [];
> db.users.aggregate({$match:{'email':'admin'}},{$unwind:"$tasks"},{$match:{'tasks.done':true}},{$project:{'tasks':1,'_id':0}}).forEach(function(u) {results.push(u.tasks)})
> results
[
        {
                "_id" : ObjectId("57372ef07329d9d8f2921ede"),
                "title" : "Done1",
                "description" : "Done1Desc",
                "currentPeriod" : 3,
                "periodQuantity" : 3,
                "done" : true
        },
        {
                "_id" : ObjectId("57372ef07329d9d8f2921edf"),
                "title" : "Done2",
                "description" : "Done2Desc",
                "currentPeriod" : 11,
                "periodQuantity" : 11,
                "done" : true
        },
        {
                "_id" : ObjectId("57372ef07329d9d8f2921ee3"),
                "title" : "Done3",
                "description" : "Done3Desc",
                "currentPeriod" : 3,
                "periodQuantity" : 3,
                "done" : true
        },
        {
                "_id" : ObjectId("57372ef07329d9d8f2921ee4"),
                "title" : "Done4",
                "description" : "Done4Desc",
                "currentPeriod" : 4,
                "periodQuantity" : 4,
                "done" : true
        }
]
>

我尝试在第二个片段的末尾使用 foreach 和 every 函数,但是当我这样做时,我收到错误

TypeError: User.aggregate(...).forEach is not a function

最佳答案

这可以在聚合查询中使用 $group 来完成。检查下面的查询:

db.users.aggregate.aggregate([{
    $unwind: '$tasks'
}, {
    $match: {
        email: req.user.email,
        'tasks.done': true
    }
}, {
    $group: {
        _id: null,
        tasks: {
            $push: '$tasks'
        }
    }
}]);

关于node.js - Mongoose - foreach 循环与聚合结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37229103/

相关文章:

node.js - 使用 nvm-windows 并行运行两个 Node 版本

javascript - Node js异步模块系列依赖

mongodb - 在 CentOS 7 上安装 Mongodb 3.6

node.js - Mongoose 查询不返回值

node.js - 通过在 body、mongoose/mongodb 中提供文档来更新多个文档

node.js - 从node.js中的mongoDB数据生成JSON树

javascript - 即使使用 extraData={this.state},PureComponent FlatList 也不会重新渲染

javascript - 为什么多次运行 CoffeeScript 编译器会产生不同的输出?

linux - 为什么我的 mongodb 连接不到 28017 端口?

node.js - Openshift 的 MongoDB 大小限制是多少?