5.2 Работа с идентификаторами документов
В этом разделе описывается, что такое идентификатор документа и как с ним работать.
Каждый документ имеет уникальный идентификатор, называемый идентификатором документа, который можно рассматривать как аналог первичного ключа таблицы. Значение идентификатора документа обычно автоматически генерируется сервером при добавлении документа, но также может быть присвоено вручную. Присвоенный идентификатор документа возвращается в свойстве generatedIds объекта Result (AddResult для Connector/J) для операции collection.add() и может быть получен с помощью метода getGeneratedIds(). Дополнительную информацию об идентификаторах документов см. в разделе 5.3 «Понимание идентификаторов документов».
Следующий пример на JavaScript демонстрирует добавление документа в коллекцию, извлечение идентификаторов добавленного документа и проверку, что дубликаты идентификаторов добавить нельзя.
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 документа. Идентификатор документа является строкой с максимальной длиной 32 символа. Если при создании документа предоставлен _id, он используется; если _id не предоставлен, он автоматически назначается документу.
Следующий пример иллюстрирует, как значение _id может быть предоставлено или сгенерировано автоматически. Предполагается, что схема test существует и назначена переменной db, что коллекция my_collection существует и что custom_id является уникальным.
Код JavaScript MySQL Shell
// 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]);
Код Python MySQL Shell
# If the _id is provided, it will be honored
result = myColl.add( { '_id': 'custom_id', 'a' : 1 } ).execute()
document = myColl.find('a = 1').execute().fetch_one()
print("User Provided Id: %s" % document._id)
# If the _id is not provided, one will be automatically assigned
result = myColl.add( { 'b': 2 } ).execute()
print("Autogenerated Id: %s" % result.get_generated_ids()[0])
Код JavaScript Node.js
// If the _id is provided, it will be honored
myColl.add({ _id: 'custom_id', a : 1 }).execute().then(function () {
myColl.getOne('custom_id').then(function (doc) {
console.log('User Provided Id:', doc._id);
});
});
// If the _id is not provided, one will be automatically assigned
myColl.add({ b: 2 }).execute().then(function (result) {
console.log('Autogenerated Id:', result.getGeneratedIds()[0]);
});
Код C#
// If the _id is provided, it will be honored
var result = myColl.Add(new { _id = "custom_id", a = 1 }).Execute();
Console.WriteLine("User Provided Id:", result.AutoIncrementValue);
// If the _id is not provided, one will be automatically assigned
result = myColl.Add(new { b = 2 }).Execute();
Console.WriteLine("Autogenerated Id:", result.AutoIncrementValue);
Код Python
# If the _id is provided, it will be honored
result = my_coll.add({'_id': 'custom_id', 'a': 1}).execute()
print("User Provided Id: {0}".format(result.get_last_document_id()))
# If the _id is not provided, one will be automatically assigned
result = my_coll.add({'b': 2}).execute()
print("Autogenerated Id: {0}".format(result.get_last_document_id()))
Код Java
// If the _id is provided, it will be honored
AddResult result = coll.add("{\"_id\":\"custom_id\",\"a\":1}").execute();
System.out.println("User Provided Id:" + ((JsonString) coll.getOne("custom_id").get("_id")).getString());
// If the _id is not provided, one will be automatically assigned
result = coll.add("{\"b\":2}").execute();
System.out.println("Autogenerated Id:" + result.getGeneratedIds().get(0));
Код C++
// If the _id is provided, it will be honored
Result result = myColl.add(R"({ "_id": "custom_id", "a" : 1 })").execute();
std::vector<string> ids = result.getGeneratedIds();
if (ids.empty())
cout << "No Autogenerated Ids" << endl;
// If the _id is not provided, one will be automatically assigned
result = myColl.add(R"({ "b": 2 })").execute();
ids = result.getGeneratedIds();
cout << "Autogenerated Id:" << ids[0] << endl;
Некоторые документы имеют естественный уникальный ключ. Например, коллекция, содержащая список книг, вероятно, будет включать Международный стандартный номер книги (ISBN) для каждого документа, представляющего книгу. ISBN — это строка длиной 13 символов, что полностью соответствует пределу длины в 32 символа для поля _id.
// 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(), чтобы извлечь только что вставленную книгу из коллекции по ее идентификатору документа.
var book = myColl.find('_id = "978-1449374020"').execute();
В настоящее время X DevAPI не поддерживает использование каких-либо полей документа, кроме неявного _id, в качестве идентификатора документа — нет способа определить другой ключ для выполнения той же функции.
© 2025 Oracle
Licensed under the GPLv2 License.