我使用带有 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/