Node.js 从ID'获取用户数据;对象数组中的s

Node.js 从ID'获取用户数据;对象数组中的s,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我没有在mongo上做太多的工作,所以来自mysql有点挑战性。我想做的是在我的朋友数组中获取用户的数据,即:他们的姓名、电子邮件等。这是我下面的内容。当我点击某个路由时,我会将我的ID发送到api端点。然后我需要从数组中获取朋友ID,并获取他们的相关信息 数据库中的记录 { "_id": { "$oid": "5f1b22a427e4624711bdef0e" }, "friends&

我没有在mongo上做太多的工作,所以来自mysql有点挑战性。我想做的是在我的朋友数组中获取用户的数据,即:他们的姓名、电子邮件等。这是我下面的内容。当我点击某个路由时,我会将我的ID发送到api端点。然后我需要从数组中获取朋友ID,并获取他们的相关信息

数据库中的记录

{
    "_id": {
        "$oid": "5f1b22a427e4624711bdef0e"
    },
    "friends": [{
        "$oid": "5f206e15e9b66391246788d6"
    }, {
        "$oid": "5f2456777656525890dd9c21"
    }],
    "name": "Joe Smith",
    "email": "joesmith@gmail.com",
    "mobile": "1233455467889",
}
控制器

exports.getAddedContacts = async (req, res) => {
  const userId = req.params.uid;
  let friends;

  try {
    friends = await User.find({ _id: userId });
  } catch (err) {
    res
      .status(500)
      .json({ error: "Something went wrong, could not get contacts" });
  }

  if (!friends || friends.length === 0) {
    res.status(404).json({ error: "No contacts found..." });
  }

  res.status(200).json({ friends: friends });
};

您可以使用聚合,在聚合中使用$match作为管道中的第一个阶段,这样您就可以只隔离一个用户,然后使用populate来获取您的好友文档

以下是一个例子:

db.classes.insert( [
   { _id: 1, title: "Reading is ...", enrollmentlist: [ "giraffe2", "pandabear", "artie" ], days: ["M", "W", "F"] },
   { _id: 2, title: "But Writing ...", enrollmentlist: [ "giraffe1", "artie" ], days: ["T", "F"] }
])
db.members.insert( [
   { _id: 1, name: "artie", joined: new Date("2016-05-01"), status: "A" },
   { _id: 2, name: "giraffe", joined: new Date("2017-05-01"), status: "D" },
   { _id: 3, name: "giraffe1", joined: new Date("2017-10-01"), status: "A" },
   { _id: 4, name: "panda", joined: new Date("2018-10-11"), status: "A" },
   { _id: 5, name: "pandabear", joined: new Date("2018-12-01"), status: "A" },
   { _id: 6, name: "giraffe2", joined: new Date("2018-12-01"), status: "D" }
])
db.classes.aggregate([
   {
      $match: {
        _id: 1
      }
   }
   {
      $lookup:
         {
            from: "members",
            localField: "enrollmentlist",
            foreignField: "name",
            as: "enrollee_info"
        }
   }
])
你可以在官方网站上了解更多

注意结果,聚合总是返回一个列表,因此您必须执行类似于
const[user]=wait result.toArray()的操作

由于您使用mongoose,您也可以尝试在模型上使用populate(),如下所示:


const author=新作者({
_id:new mongoose.Types.ObjectId(),
名字:“伊恩·弗莱明”,
年龄:50
});
author.save(函数(err){
if(err)返回handleError(err);
const story1=新故事({
标题:“皇家赌场”,
作者:作者。_id//从此人处分配_id
});
故事1.保存(函数(错误){
if(err)返回handleError(err);
//就这样!
});
});
故事
findOne({title:'Casino Royale'})。
填充('author')。
执行(功能(错误、故事){
if(err)返回handleError(err);
console.log('作者是%s',story.author.name);
//打印“作者是伊恩·弗莱明”
});

注意:我在您的问题中注意到,您正在将应该是
ObjectID
-s数组的内容存储为一个对象数组,该数组包含表示
ObjectID
的单个字段字符串,如果您希望填充或查找工作,则必须对此进行更改。

我在这里有点困惑,看起来您的示例使用了两个不同的文档,一个用于成员,一个用于类。我只有一个是Users,并且在用户文档中有一个friends数组。我认为引用$lookup解决方案的同一集合没有问题,在第二个集合中,模型用户应该在friends字段中包含self reference,这是可行的,但是另一个问题的主题,我知道其中一个已经得到了回答,所以,我会看看我是否能在当天晚些时候把它挖出来。我真的用findOne和populate让它工作了,谢谢!很高兴听到它帮助了你!