【问题标题】:Mongoose - foreach loop with aggregate resultMongoose - 具有汇总结果的 foreach 循环
【发布时间】:2016-09-10 18:40:33
【问题描述】:

我正在使用带有 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
    }]

});

我想要做的是(例如)获取任务,其中“完成”变量设置为 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
        }
]
>

我尝试在 second 的 sn-p 结束时使用 foreach 和 each 函数,但是当我这样做时出现错误

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

【问题讨论】:

  • 我也有同样的问题。 forEach 不是一个函数,显然 mongoose 没有那个特性。你解决这个?怎么样?
  • 嗨,据我所知,我已经放弃了这种方法 - 但我也无法访问代码,所以我无能为力

标签: node.js mongodb mongoose mean-stack


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-05
    • 2018-02-20
    • 2015-05-30
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    相关资源
    最近更新 更多