【问题标题】:When should I use _id in MongoDB?什么时候应该在 MongoDB 中使用 _id?
【发布时间】:2019-12-16 10:37:33
【问题描述】:

MongoDB 的每个文档都有一个名为“_id”的字段。我看到人们到处使用它作为主键,并在查询中使用它来通过 _id 查找文档。

此字段默认使用自动生成的 ObjectId,例如:

db.tasks.findOne()
{
    _id: ObjectID("ADF9"), 
    description: "Write lesson plan",
    due_date:  ISODate("2014-04-01"),
    owner: ObjectID("AAF1")     // Reference to another document
}

但是在 JavaScript 中,对象中字段后面的下划线是私有的约定,并且由于 MongoDB 使用 JSON(特别是 BSON),我应该使用这些 _id 来查询、查找和描述文档之间的关系吗?好像不太对。

看到MongoDB有办法生成UUIDhttps://docs.mongodb.com/manual/reference/method/UUID

我是否应该忘记 _id 属性,并使用 UUID 创建自己的索引 id 属性?

【问题讨论】:

    标签: database mongodb


    【解决方案1】:

    对用户生成的内容使用 UUID,例如命名图像上传。 UUID 可以在 URL 中或当用户在客户端检查图像时向用户公开。对于服务器上/未向用户公开的所有内容,无需生成 UUID,最好使用自动生成的_id

    使用 UUID 的一个简单示例是:

    const uuid = require('uuid');
    
    exports.nameFile= async (req, res, next) => {
      req.body.photo = `${uuid.v4()}.${extension}`;
      next();
    };
    

    【讨论】:

      【解决方案2】:

      MongoDB 如何命名它的事物不应影响您如何命名事物。如果第三方发送的数据违反了您同意遵循的约定,则您必须在数据到达您的应用程序后立即将其转换为您想要的格式。

      基于您的案例的示例:

      function findTaskById(id) {
          var result = db.tasks.findOne({"_id": id});
      
          var task = {
              id: result._id,
              description: result.description,
              something: result.something  
          };
          return task;
      }
      

      通过这种方式,您可以将 Mongo 的 _id 的使用隔离到负责与数据库交互的应用程序层中。其他需要任务的地方,可以使用task.id

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 2011-04-15
        • 2017-04-10
        • 2012-03-19
        • 2018-05-12
        • 2018-12-11
        • 1970-01-01
        相关资源
        最近更新 更多