我不确定如何做我想做的事情。我的架构是这样的:
var userObj = mongoose.Schema({
'timestamp':{type: Date, default: Date.now()},
'password':{type:String, required:true},
"userName":{type:String, required:true, unique:true}
});
var groupSchema = mongoose.Schema({
'creator':String,
'members':Array, //contains the _id of users added to the group
'admins':Array,
'name':String,
'timestamp':{type: Date, default: Date.now()},
'description':String
});
成员架构的数组包含用户ID。我需要从组文档中获取数组并获取用户名。
我开始使用mongoose .find()方法循环并将结果推送到数组中 - 但正如我所料,数组在回调函数范围之外是空的。
var dat = [];
for(var i = 0; i<passed.payload.length;i++){
user.find({'_id':passed.payload[i]},'userName',function(err,result){
if(err){
console.log(err);
}else{
dat.push(result);
}
})
}
//res.send(dat)
console.log(dat);
我不知道该怎么做 - 我考虑使用.find拉取所有用户ID然后运行数组只返回匹配。这似乎是浪费资源来拉动完整的用户表然后测试它。
是否有一个更复杂的查询我可以使用mongoose来使用_ids数组来匹配这样的数据?
答案 0 :(得分:0)
您是否考虑过使用$in
运营商?
db.users.find( { userName: { $in: ["Paul", "Jenna" ] } } )
这应该更有效并且也会删除循环。
这里是MongoDB文档的链接 https://docs.mongodb.com/manual/reference/operator/query/in/#op._S_in
答案 1 :(得分:0)
你在for循环外得到一个空数组的原因是mongoose查询是异步的(在你的情况下是User.find()
)因此for循环将在mongoose查询完成之前完成,从而产生你得到的空数组。您可以使用promises或某些npm模块(如async。
但是,由于@karlkurzer建议您不需要在此处循环播放数组,因此您可以使用$in
operator。上面的代码可以替换为,
user.find({'_id': {$in: passed.payload}},'userName',function(err,results){
if(err){
console.log(err);
}else{
console.log(results); //You will get array of user names here
}
});
你应该得到一个与你在回调中传递的id相关联的userNames数组。
希望这有帮助!