5.2 使用文档 ID

本节介绍了什么是文档 ID 以及如何使用它。

每个文档都有一个称为文档 ID 的唯一标识符,可以将其视为表的“主键”。文档 ID 值通常在添加文档时由服务器自动生成,但也可以手动分配。分配的文档 ID 在 collection.add() 操作的 Result(Connector/J 为 AddResult)对象的 generatedIds 属性中返回,并且可以使用 getGeneratedIds() 方法访问。有关文档 ID 的更多背景信息,请参阅第 5.3 节“了解文档 ID”

以下 JavaScript 代码示例展示了如何将文档添加到集合中,检索添加的文档的 ID 并测试是否可以添加重复的 ID。

Press CTRL+C to copy
mysql-js > var result = mycollection.add({test:'demo01'}).execute() mysql-js > print(result.generatedIds) [ "00006075f6810000000000000006" ] mysql-js > var result = mycollection.add({test:'demo02'}).add({test:'demo03'}).execute() mysql-js > print(result.generatedIds) [ "00006075f6810000000000000007", "00006075f6810000000000000008" ] mysql-js > mycollection.find() { "_id": "00006075f6810000000000000006", "test": "demo01" } { "_id": "00006075f6810000000000000007", "test": "demo02" } { "_id": "00006075f6810000000000000008", "test": "demo03" } 3 documents in set (0.0102 sec) mysql-js > var result = mycollection.add({_id:'00006075f6810000000000000008', test:'demo04'}).execute() Document contains a field value that is not unique but required to be (MySQL Error 5116)

如上面的示例所示,文档 ID 存储在文档的 _id 字段中。文档 ID 是一个最大长度为 32 个字符的 VARBINARY()。如果在创建文档时提供了 _id,则会使用该值;如果没有提供 _id,则会自动为文档分配一个。

以下示例说明了如何提供或自动生成 _id 值。假设 test 模式存在并且分配给了变量 db,集合 my_collection 存在并且 custom_id 是唯一的。

Press CTRL+C to copy
// If the _id is provided, it will be honored var result = myColl.add( { _id: 'custom_id', a : 1 } ).execute(); var document = myColl.find("a = 1").execute().fetchOne(); print("User Provided Id:", document._id); // If the _id is not provided, one will be automatically assigned result = myColl.add( { b: 2 } ).execute(); print("Autogenerated Id:", result.getGeneratedIds()[0]);

某些文档具有自然的唯一键。例如,包含书籍列表的集合可能会为表示书籍的每个文档包含国际标准书号 (ISBN)。ISBN 是一个长度为 13 个字符的字符串,完全在 _id 字段的 32 个字符长度限制之内。

Press CTRL+C to copy
// using a book's unique ISBN as the object ID myColl.add( { _id: "978-1449374020", title: "MySQL Cookbook: Solutions for Database Developers and Administrators" }).execute();

使用 find() 按文档 ID 从集合中获取新插入的图书。

Press CTRL+C to copy
var book = myColl.find('_id = "978-1449374020"').execute();

目前,X DevAPI 不支持使用除隐式 _id 之外的任何文档字段作为文档 ID,无法定义其他键来执行相同的功能。