根据登录用户的 ObjectID 从 Mongo 获取数据

Posted

技术标签:

【中文标题】根据登录用户的 ObjectID 从 Mongo 获取数据【英文标题】:Fetching data from Mongo based on ObjectID on logged in user 【发布时间】:2021-02-28 17:55:05 【问题描述】:

我的 Mongo DB 中有两个集合,如下所示:

文档

用户:

id: ObjectId ("5fb39e3d11eaad3e30cfb1b0")
userName: "Tobias"
password: "yyy"

id: ObjectId ("5fb3c83fb774ff3340482250")
userName: "Thor"
password: "xxx"

课程:

id: ObjectId ("5fb3cf3da8227e101826e2db")
CourseName: "Design"
userId: "5fb39e3d11eaad3e30cfb1b0" (THIS IS THE SAME AS THE OBJECT ID FOR THE FIRST USER) 

当用户登录时,用户可以添加课程,登录用户的对象 ID 将与课程名称一起添加到 MongoDB 的集合中(就像上面的示例一样)。

我的问题是,如何只显示与登录用户匹配的课程?我使用 mongoose 进行用户登录,express 用于服务器连接,ejs 用于查看,VueJS 用于控制。

我来自关系数据库,所以不确定我在这里尝试加入 objectID 的方法是否是好的做法。

【问题讨论】:

在 mongodb 世界中你通常会尝试嵌入数据 阅读更多关于 mongoose.find() 方法的信息。 【参考方案1】:

mysql中加入,在mongodb中使用$lookup

   CoursesModel.aggregate([
      
        $lookup: 
          from: UserModel.collection.name,
          localField: "userId",
          foreignField: "_id",
          as: "user"
        
      ,
    ]).then(result => 
       console.log(result);
    )

在您的结果中,您将有一个名为user 的附加字段。这将是一个包含与 userId 匹配的所有文档的数组

您可以使用字符串作为名称,而不是 UserModel.collection.name。但我更喜欢以编程方式使用集合名称。

【讨论】:

我无法将 userId 聚合到 _Id 因为它是 ObjectId 而另一个只是一个字符串..【参考方案2】:

您可以使用find()findOne() 函数。

courses.findOne(function (err, course) 
  if (err) return handleError(err);
  if (course) 
//do Something
  
);

【讨论】:

以上是关于根据登录用户的 ObjectID 从 Mongo 获取数据的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb:从 mongo shell 中的 ObjectId 执行日期范围查询

mongo 模式(嵌入与参考)[重复]

BSON::ObjectId 与 Mongo::ObjectID

BSON::ObjectId 与 Mongo::ObjectID

使用 Pig 从 Mongo 读取未命名的字符串数组

如何在 mongo 控制台中通过 ObjectId 搜索对象?