猫鼬查询从同一表中的数组中查找名称,并从该表中获取其全部数据

时间:2019-02-25 12:57:35

标签: node.js mongodb mongoose

我在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。这样我就可以发送该数组。如果您修改此逻辑,将不胜感激,否则,建议您对查询执行此操作。

1 个答案:

答案 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);
 } 
});