我在MongoDB中有一个用户表,我在其中保存注册用户数据,并以此将其朋友名称保存在friends数组中。该架构如下。
const Schema = new mongoose.Schema({
img: { type: String, ref: 'userRequest' },
name: String,
email: String,
lastname: String,
pass: String,
phonenumber: String,
zipcode: String,
birthdate: String,
friends: []
});
var user = mongoose.model('simple-chat', Schema);
在friends数组中,名字是从不同的表中动态设置的,现在我想显示用户的朋友列表。我可以简单地从这个数组中检索朋友的名字,但是使用名字我也想显示它的图像。人的全部数据。
例如,我在表1)Userone和2)Usertwo中有2个用户数据 在userones friends数组中,它的朋友名为:usertwo。现在,如果我想显示userones朋友列表,那么我需要从数组中获取名称和相关名称,然后找到它的图像。 friendsarray。请建议我对此进行任何查询。
现在,我正在尝试通过嵌套的Find循环实现此功能,但是它无法将数据发送到客户端。
var friendname;
var friendarr = [];
app.get('/userfriendslist', (req, res) => {
user.find({ name: loginperson }, (err, result) => {
if (err) {
console.log(err);
}
else {
for (var i = 0; i < result.length; i++) {
console.log("results length" + result.length)
for (var j = 0; j < result[i].friends.length; j++) {
if (result[i].friends[j].friendname != null) {
console.log("result of one" + result[i].friends.length);
friendname = result[i].friends[j].friendname;
console.log("friend list" + friendname);
user.find({ name: friendname }, (err, doc) => {
console.log("total result" + doc);
friendarr[i] = doc;
console.log("insidefriendsarray" +friendarr[i]);
});
}
else {
console.log("No friend found");
}
}
console.log("XXXXXXX"+friendarr[i]);
/* res.send(friendarr[i]); */
}
}
})
});
我知道这不是执行此操作的正确方法。按照这种逻辑,我可以在“ friendsarray控制台”中成功获取friendsdata,但是在for循环之外,friendarray变为null。这样我就可以发送该数组。如果您修改此逻辑,将不胜感激,否则,建议您对查询执行此操作。
答案 0 :(得分:1)
在您现有的逻辑中,您可以使用async await来使代码可读,并且可以使用for ... of循环代替正常的for循环来在循环内同步运行db调用。
app.get('/userfriendslist', async (req, res) => {
try {
let friendsArr = [];
let result = await user.find({ name: loginperson });
for (let userobj of result) {
for (let friend of userobj.friends) {
if (friend.friendname != null) {
let friendname = friend.friendname;
let userFriend = await user.find({ name: friendname });
if (userFriend) friendsArr.push(userFriend);
}
else {
console.log("No friend found");
}
}
}
console.log("friendsArr is ",friendsArr);
} catch (err) {
console.log(err);
}
});