我应该何时在MongoDB中使用_id?

时间:2019-08-08 16:48:23

标签: database mongodb

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有一种生成UUID https://docs.mongodb.com/manual/reference/method/UUID

的方法

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

2 个答案:

答案 0 :(得分:0)

将UUID用于用户生成的内容,例如命名图片上传。 UUID可以通过URL或用户在客户端检查图像时向用户公开。对于服务器上所有/未公开给用户的所有内容,都无需生成UUID,因此首选使用自动生成的_id

使用UUID的简单示例是:

const uuid = require('uuid');

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

答案 1 :(得分:0)

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