【发布时间】:2021-11-12 22:20:35
【问题描述】:
我想获取所有用户的列表,将列表与调查数据库进行比较,以查看每个用户收到了多少票,并将这些投票值附加到用户对象,然后发送回前面。
我读过这样的例子: 'TypeError: meme.find(...).forEach is not a function' in mongoose node js? 和这个: Adding Properties in a forEach Loop in Mongoose
我正在尝试做同样的事情。
我有简单的代码,但它不起作用。
尝试 #1:
let users = await User.find({teams: {$in: req.user.team_oid}}, {_id: 1, firstname: 1, lastname: 1})
users.forEach(async(user, i) => {
let nomineeCount = await Survey.countDocuments({_id: mongoose.Types.ObjectId(req.params.s_oid), 'facilitators.nominee': mongoose.Types.ObjectId(user._id) })
user["votes"] = nomineeCount;
if(i+1 === users.length) {res.json({users: users})}
})
除了user 没有收到["votes"] 属性之外,查询和一切都正常工作。
尝试 #2:
let users = await User.find({teams: {$in: req.user.team_oid}}, {_id: 1, firstname: 1, lastname: 1})
let nominees = users;
users.map( async (user, i) => {
let nomineeCount = await Survey.countDocuments({_id: mongoose.Types.ObjectId(req.params.s_oid), 'facilitators.nominee': mongoose.Types.ObjectId(user._id) })
nominees[i].votes = nomineeCount;
if(i+1 === nominees.length) {res.json({users: nominees})}
})
这也无法附加.votes 属性。
任何想法/建议表示赞赏。
【问题讨论】:
-
能否提供样本数据
-
这很简单。
users是:[{_id: ObjectId, firstname: string, lastname: string }],对于nomineeCount,它返回Number -
这里的问题是异步
forEach函数导致所有函数调用同时运行;你会想要使用 Promise.all 或 for 循环,所以当 res.json() 被调用时,它们的异步调用实际上已经全部完成。
标签: javascript mongodb object foreach