Следующий раздел объясняет, как работать с коллекциями, как использовать операции CRUD на коллекциях и возвратить документы.
Работа с коллекциями документов прямая, используя X DevAPI. Следующие примеры показывают основное использование операций CRUD, работая с документами.
После установления связи с сервером MySQL, создается новая коллекция,
которая может содержать документы JSON, и вставляются несколько документов.
Затем операция поиска выполняется, чтобы искать определенный документ из
коллекции. Наконец, коллекция удалена из базы данных.
Пример предполагает, что испытательная схема существует, а коллекция
my_collection
нет.
MySQL Shell JavaScript Code
// Connecting to MySQL Server and working with a Collection
var mysqlx = require('mysqlx');
// Connect to server
var mySession = mysqlx.getSession( {
host: 'localhost', port: 33060,
user: 'user', password: 'password
'} );
var myDb = mySession.getSchema('test');
// Create a new collection 'my_collection'
var myColl = myDb.createCollection('my_collection');
// Insert documents
myColl.add({_id: '1', name: 'Laurie', age: 19}).execute();
myColl.add({_id: '2', name: 'Nadya', age: 54}).execute();
myColl.add({_id: '3', name: 'Lukas', age: 32}).execute();
// Find a document
var docs = myColl.find('name like :param1 AND age < :param2').limit(1).
bind('param1','L%').bind('param2',20).execute();
// Print document
print(docs.fetchOne());
// Drop the collection
myDb.dropCollection('my_collection');
MySQL Shell Python Code
# Connecting to MySQL Server and working with a Collection
from mysqlsh import mysqlx
# Connect to server
mySession = mysqlx.get_session( {
'host': 'localhost', 'port': 33060,
'user': 'user', 'password': 'password
'} )
myDb = mySession.get_schema('test')
# Create a new collection 'my_collection'
myColl = myDb.create_collection('my_collection')
# Insert documents
myColl.add({'_id': '1', 'name': 'Laurie', 'age': 19}).execute()
myColl.add({'_id': '2', 'name': 'Nadya', 'age': 54}).execute()
myColl.add({'_id': '3', 'name': 'Lukas', 'age': 32}).execute()
# Find a document
docs = myColl.find('name like :param1 AND age < :param2') \
.limit(1) \
.bind('param1','L%') \
.bind('param2',20) \
.execute()
# Print document
doc = docs.fetch_one()
print(doc)
# Drop the collection
myDb.drop_collection('my_collection')
Node.js JavaScript Code
// -------------------------------------------------- // Connecting to MySQL Server and working with a Collection var mysqlx = require('@mysql/xdevapi'); var db; // Connect to server mysqlx .getSession({ user: 'user', password: 'password', host: 'localhost', port: '33060', }) .then(function (session) { db = session.getSchema('test'); // Create a new collection 'my_collection' return db.createCollection('my_collection'); }) .then(function (myColl) { // Insert documents return Promise .all([ myColl.add({ name: 'Laurie', age: 19 }).execute(), myColl.add({ name: 'Nadya', age: 54 }).execute(), myColl.add({ name: 'Lukas', age: 32 }).execute() ]) .then(function () { // Find a document return myColl .find('name like :name && age < :age') .bind({ name: 'L%', age: 20 }) .limit(1) .execute(function (doc) { // Print document console.log(doc); }); }); }) .then(function(docs) { // Drop the collection return db.dropCollection('my_collection'); }) .catch(function(err) { // Handle error });
C# Code
// Connecting to MySQL Server and working with a Collection
// Connect to server
var mySession = MySQLX.GetSession("server=localhost;port=33060;user=user;password=password
;");
var myDb = mySession.GetSchema("test");
// Create a new collection "my_collection"
var myColl = myDb.CreateCollection("my_collection");
// Insert documents
myColl.Add(new { name = "Laurie", age = 19}).Execute();
myColl.Add(new { name = "Nadya", age = 54}).Execute();
myColl.Add(new { name = "Lukas", age = 32}).Execute();
// Find a document
var docs = myColl.Find("name like :param1 AND age < :param2").Limit(1)
.Bind("param1", "L%").Bind("param2", 20).Execute();
// Print document
Console.WriteLine(docs.FetchOne());
// Drop the collection
myDb.DropCollection("my_collection");
Python Code
# Connecting to MySQL Server and working with a Collection import mysqlx # Connect to server my_session = mysqlx.get_session({ 'host': 'localhost', 'port': 33060, 'user': 'user', 'password': 'password' }) my_schema = my_session.get_schema('test') # Create a new collection 'my_collection' my_coll = my_schema.create_collection('my_collection') # Insert documents my_coll.add({'name': 'Laurie', 'age': 19}).execute() my_coll.add({'name': 'Nadya', 'age': 54}).execute() my_coll.add({'name': 'Lukas', 'age': 32}).execute() # Find a document docs = my_coll.find('name like :param1 AND age < :param2') \ .limit(1) \ .bind('param1', 'L%') \ .bind('param2', 20) \ .execute() # Print document doc = docs.fetch_one() print("Name: {0}".format(doc['name'])) print("Age: {0}".format(doc['age])) # Drop the collection my_session.drop_collection('test', 'my_collection')
Java Code
// Connect to server Session mySession = new SessionFactory().getSession("mysqlx://localhost:33060/test?user=user&password=password"); Schema myDb = mySession.getSchema("test"); // Create a new collection 'my_collection' Collection myColl = myDb.createCollection("my_collection"); // Insert documents myColl.add("{\"name\":\"Laurie\", \"age\":19}").execute(); myColl.add("{\"name\":\"Nadya\", \"age\":54}").execute(); myColl.add("{\"name\":\"Lukas\", \"age\":32}").execute(); // Find a document DocResult docs = myColl.find("name like :name AND age < :age") .bind("name", "L%").bind("age", 20).execute(); // Print document DbDoc doc = docs.fetchOne(); System.out.println(doc); // Drop the collection myDB.dropCollection("my_collection");
C++ Code
// Connecting to MySQL Server and working with a Collection #include <mysqlx/xdevapi.h> // Connect to server Session session(33060, "user", "password"); Schema db = session.getSchema("test"); // Create a new collection 'my_collection' Collection myColl = db.createCollection("my_collection"); // Insert documents myColl.add(R"({"name": "Laurie", "age": 19})").execute(); myColl.add(R"({"name": "Nadya", "age": 54})").execute(); myColl.add(R"({"name": "Lukas", "age": 32})").execute(); // Find a document DocResult docs = myColl.find("name like :param1 AND age < :param2").limit(1) .bind("param1","L%").bind("param2",20).execute(); // Print document cout << docs.fetchOne(); // Drop the collection db.dropCollection("my_collection");
Документы того же самого типа группируются и хранятся в базе данных как коллекции. X DevAPI использует объекты коллекции, чтобы сохранить документы.
Чтобы создать новую коллекцию, вызовите функцию
createCollection()
от объекта схемы.
Это возвращает Объект коллекции, который может использоваться сразу же,
например чтобы вставить документы в коллекцию.
Произвольно, поле reuseExistingObject
может быть установлено в true и передаваться как второй параметр, чтобы
предотвратить ошибку, если коллекция с тем же самым именем уже существует.
MySQL Shell JavaScript Code
// Create a new collection called 'my_collection' var myColl = db.createCollection('my_collection');
MySQL Shell Python Code
# Create a new collection called 'my_collection' myColl = db.create_collection('my_collection')
Node.js JavaScript Code
// Create a new collection called 'my_collection' var promise = db.createCollection('my_collection'); // Create a new collection or reuse existing one var promise = db.createCollection('my_collection', { ReuseExistingObject: true } );
C# Code
// Create a new collection called "my_collection" var myColl = db.CreateCollection("my_collection"); // Create a new collection or reuse existing one var myExistingColl = db.CreateCollection("my_collection", ReuseExistingObject: true);
Python Code
# Create a new collection called 'my_collection' my_coll = my_schema.create_collection('my_collection')
Java Code
// Create a new collection called 'my_collection' Collection myColl = db.createCollection("my_collection"); // Create a new collection or reuse existing one // second parameter is: boolean reuseExistingObject Collection myExistingColl = db.createCollection("my_collection", true);
C++ Code
// Create a new collection called 'my_collection' Collection myColl = db.createCollection("my_collection"); // Create a new collection or reuse existing one Collection myExistingColl = db.createCollection("my_collection", true);
Чтобы получить объект коллекции для существующей коллекции, сохраненной в
базе данных, вызовите функцию getCollection()
от объекта схемы.
MySQL Shell JavaScript Code
// Get a collection object for 'my_collection' var myColl = db.getCollection('my_collection');
MySQL Shell Python Code
# Get a collection object for 'my_collection' myColl = db.get_collection('my_collection')
Node.js JavaScript Code
// Get a collection object for 'my_collection' var collection = db.getCollection('my_collection');
C# Code
// Get a collection object for "my_collection" var myColl = db.GetCollection("my_collection"); // Get a collection object but also ensure it exists in the database var myColl2 = db.GetCollection("my_collection", ValidateExistence: true);
Python Code
# Get a collection object for 'my_collection' my_coll = my_schema.get_collection('my_collection')
Java Code
// Get a collection object for 'my_collection' Collection myColl = db.getCollection("my_collection"); // Get a collection object but also ensure it exists in the database // second parameter is: boolean requireExists Collection myColl = db.getCollection("my_collection", true);
C++ Code
// Get a collection object for 'my_collection' Collection myColl = db.getCollection("my_collection"); // Get a collection object but also ensure it exists in the database Collection myColl = db.getCollection("my_collection", true);
Если коллекция еще не существует в базе данных, любой последующий вызов
функции объекта коллекции выдаст ошибку. Чтобы предотвратить это и
зафиксировать ошибку сразу же, установите поле
validateExistence
= true и передайте его
как второй параметр db.getCollection()
.
Поля createCollection()
и
ReuseExistingObject
, установленные в true,
могут использоваться, чтобы создать новую или снова использовать
существующую коллекцию с именем.
В большинстве случаев хорошая практика это создать объекты базы данных в течение времени разработки и воздержаться от создания их на лету во время производственной стадии проекта базы данных. Поэтому лучше отделять код, который создает коллекции в базе данных, от кода пользовательского приложения.
Чтобы сделать большое количество документов более эффективным, может помочь создание индекса на основе одного или более полей, найденных в документах в коллекции. Этот раздел описывает, как внести индекс в коллекцию.
Индексы коллекции это обычные индексы MySQL на виртуальных столбцах,
которые извлекают данные из документов в коллекции. В настоящее время MySQL
не может внести значения JSON в указатель непосредственно, поэтому чтобы
позволить индексировать коллекции с документами JSON, надо предоставить
документ JSON, который указывает поля документа, используемые индексом.
Вы передаете документ JSON, определяющий индекс как параметр
IndexDefinition
) метода
Collection.createIndex(
. Например, чтобы создать обязательный индекс целого типа на
основе поля
name
count
:
myCollection.createIndex("count", {fields:[{"field": "$.count", " type":"INT", required:true}]});
Создать индекс на основе такого поля, как почтовый индекс, урезая результат 10 знаками:
myCollection.createIndex("zip", {fields: [{field: "$.zip", type: "TEXT(10)"}]})
См. здесь для получения информации о формате документа JSON для определения полей как типы MySQL и в настоящее время поддержанные типы MySQL.
Метод Collection.createIndex()
терпит неудачу с ошибкой, если индекс с тем же самым именем уже существует
или если определение индекса правильно не сформировано.
Параметр имени требуется и должен быть действительным именем индекса, как
принято командой SQL
CREATE INDEX
.
Чтобы удалить существующий индекс, примените метод
collection.dropIndex(string name)
.
Это удалит индекс с переданным именем, операция тихо успешна, даже
если названный индекс не существует.
Поскольку индексы коллекции сохранены как виртуальные столбцы, чтобы
проверить созданный индекс, используется
SHOW INDEX
.
Например, можно использовать этот SQL в MySQL Shell:
session.runSql('SHOW INDEX FROM mySchema.myCollection');
Чтобы создать индекс на основе документов в коллекции, необходимо создать
документ IndexDefinition
JSON.
Эта секция объясняет действительные поля, которые можно использовать в таком
документе JSON, чтобы определить индекс.
Чтобы определить область документа для индексирования, тип поля
должен быть однородным для всей коллекции. Другими словами, тип должен быть
последовательным. Документ JSON, используемый для определения индекса, такой
как {fields: [{field:
'$.username', type: 'TEXT'}]}
, может содержать следующее:
fields
:
множество по крайней мере из одного объекта
IndexField
, каждый из которых описывает область
документа JSON, которая будет включена в индекс.
Одно описание IndexField
состоит из следующих областей:
field
:
последовательность со всем путем документа к члену
документа или полем, которое будет внесено в индекс.
type
:
последовательность с одним из поддержанных типов столбца, чтобы отобразить
поле (см.
здесь). Для числовых типов, дополнительное ключевое слово
UNSIGNED
может следовать. Для типа
TEXT
может определить длину для индексации.
required
:
дополнительное булево значение, true
если поле
обязано существовать в документе. По умолчанию
false
для всех типов, кроме
GEOJSON
, там по умолчанию
true
.
options
:
дополнительное целое число, используемое в качестве специальных флагов
выбора, чтобы использовать, расшифровывая данные
GEOJSON
data.
srid
:
дополнительное целое число, значение srid, чтобы использовать,
расшифровывая данные GEOJSON
.
array
: (MySQL 8.0.17 и
выше) дополнительное булево значение, true
если
поле содержит множества. Значение по умолчанию
false
. См.
здесь.
В MySQL 8.0.16 и ранее области, которые являются множествами JSON, не поддерживаются в индексе, определение области, которая содержит данные массива, не производит ошибку сервера, но индекс не функционирует правильно.
type
:
дополнительная последовательность, которая определяет тип индекса. Одно из
INDEX
или SPATIAL
.
По умолчанию INDEX
и может быть опущен.
Например, чтобы создать индекс на основе нескольких полей:
myCollection.createIndex('myIndex', {fields: [{field: '$.myField', type: 'TEXT'}, // {field: '$.myField2', type: 'TEXT(10)'}, {field: '$.myField3', type: 'INT'}]})
Включая любые другие поля в
IndexDefinition
или
IndexField
в документ JSON, которые здесь не
упомянуты, вызов collection.createIndex()
потерпит неудачу с ошибкой.
Если тип индекса не определяется или установлен в
INDEX
, тогда получающийся индекс создается таким
же образом, как был бы создан после команды
CREATE INDEX
. Если тип индекса
SPATIAL
тогда созданный индекс совпадает с тем,
какой был бы создан после команды
CREATE INDEX
с ключевым словом
SPATIAL
, см.
SPATIAL Index Optimization и
Creating Spatial Indexes. Например:
myCollection.createIndex('myIndex', // {fields: [{field: '$.myGeoJsonField', type: 'GEOJSON', required: true}], type:'SPATIAL'})
Используя тип индекса SPATIAL
,
поле required
не может быть установлено в
false
в записях
IndexField
.
Значения индексируемых областей преобразовываются от JSON до типа,
определенного в IndexField
,
используя стандартные преобразования типов MySQL (см.
Type Conversion in Expression Evaluation), за исключением
GEOJSON
, который использует функцию
ST_GeomFromGeoJSON()
для
конвертации. Это означает что, используя числовой тип в
IndexField
, фактическое нечисловое
значение поля преобразовывается в 0.
Поля options
и
srid
в IndexField
могут присутствовать только, если
type
= GEOJSON
.
Если существуют, они используются в качестве параметров для
ST_GeomFromGeoJSON()
,
преобразовывая GEOJSON
в значения MySQL
GEOMETRY
.
Следующие типы данных поддерживаются для областей документа. Описания типа нечувствительны к регистру.
INT
[UNSIGNED]
TINYINT
[UNSIGNED]
SMALLINT
[UNSIGNED]
MEDIUMINT
[UNSIGNED]
INTEGER
[UNSIGNED]
BIGINT
[UNSIGNED]
REAL
[UNSIGNED]
FLOAT
[UNSIGNED]
DOUBLE
[UNSIGNED]
DECIMAL
[UNSIGNED]
NUMERIC
[UNSIGNED]
GEOJSON
(extra options: options, srid)
Для MySQL 8.0.17 и выше X DevAPI поддерживает индексы на основе областей
множества, устанавливая поле
array
= true
в
IndexField
. Например, чтобы создать индекс на
области множества emails
:
collection.createIndex("emails_idx", // {fields: [{"field": "$.emails", "type":"CHAR(128)", "array": true}]});
Следующие ограничения относятся к созданию индексов на основе множеств:
Для каждого индекса только одна индексируемая
область может быть array
.
Типы данных, для которых может быть создан индекс на множествах:
Следующий раздел объясняет отдельные функции объекта коллекции.
Наиболее распространенные операции, которые будут выполнены на коллекции, являются Create, Read, Update, Delete (CRUD). Чтобы ускорить операции поиска, рекомендуется сделать надлежащее использование индексов.
Collection.add()
используется, чтобы хранить
документы в базе данных. Это берет единый документ или список документов и
выполняет функцию run()
.
Коллекция должна быть создана функцией
Schema.createCollection()
перед вставкой
документов. Чтобы вставить документы в существующую коллекцию используют
Schema.getCollection()
.
Следующий пример показывает, как использовать
Collection.add()
. Пример предполагает, что
испытательная схема существует, а коллекция
my_collection
нет.
MySQL Shell JavaScript Code
// Create a new collection var myColl = db.createCollection('my_collection'); // Insert a document myColl.add( {_id: '1', name: 'Laurie', age: 19 } ).execute(); // Insert several documents at once myColl.add( [ {_id: '5', name: 'Nadya', age: 54 }, {_id: '6', name: 'Lukas', age: 32 } ] ).execute();
MySQL Shell Python Code
# Create a new collection myColl = db.create_collection('my_collection') # Insert a document myColl.add( {'_id': '1', 'name': 'Laurie', 'age': 19 } ).execute() # Insert several documents at once myColl.add( [ {'_id': '5', 'name': 'Nadya', 'age': 54 }, {'_id': '6', 'name': 'Lukas', 'age': 32 } ] ).execute()
Node.js JavaScript Code
// Create a new collection db.createCollection('myCollection').then(function (myColl) { return Promise.all([ // Insert a document myColl .add({ name: 'Laurie', age: 19 }) .execute(), // Insert several documents at once myColl .add([ { name: 'Nadya', age: 54 }, { name: 'Lukas', age: 32 } ]) .execute() ]) });
C# Code
// Assumptions: test schema assigned to db, my_collection collection not exists // Create a new collection var myColl = db.CreateCollection("my_collection"); // Insert a document myColl.Add(new { name = "Laurie", age = 19 }).Execute(); // Insert several documents at once myColl.Add(new[] { new { name = "Nadya", age = 54 }, new { name = "Lukas", age = 32 } }).Execute();
Python Code
# Create a new collection my_coll = my_schema.create_collection('my_collection') # Insert a document my_coll.add({'name': 'Laurie', 'age': 19}).execute() # Insert several documents at once my_coll.add([ {'name': 'Nadya', 'age': 54}, {'name': 'Lukas', 'age': 32} ]).execute()
Java Code
// Create a new collection Collection coll = db.createCollection("payments"); // Insert a document coll.add("{\"name\":\"Laurie\", \"age\":19}"); // Insert several documents at once coll.add("{\"name\":\"Nadya\", \"age\":54}", "{\"name\":\"Lukas\", \"age\":32}");
C++ Code
// Create a new collection Collection coll = db.createCollection("payments"); // Insert a document coll.add(R"({"name":"Laurie", "age":19})").execute(); // Insert several documents at once std::list<DbDoc> docs = { DbDoc(R"({"name":"Nadya", "age":54})"), DbDoc(R"({"name":"Lukas", "age":32})")}; coll.add(docs).execute();
У каждого документа есть уникальный идентификатор, названный document ID.
Этот document ID хранится в поле _id
документа.
Это VARBINARY()
с максимальной
длиной 32 знаков. Этот раздел описывает, как document ID могут
использоваться, см. детали в
раздлеле 5.1.
Следующий пример предполагает, что испытательная схема существует и
назначена на переменную db, что коллекция
my_collection
существует и что
custom_id уникален.
MySQL Shell JavaScript Code
// 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]);
MySQL Shell Python Code
# 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])
Node.js JavaScript Code
// 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# Code
// 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 Code
# 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 Code
// 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++ Code
// 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 (International Standard Book Number) для каждого документа, который
представляет книгу. ISBN это последовательность длиной в 13 знаков, которая
в пределах длины поля _id
.
MySQL Shell JavaScript Code
// 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()
, чтобы получить
недавно вставленную книгу из коллекции по ее document ID:
MySQL Shell JavaScript Code
var book = myColl.find('_id = "978-1449374020"').execute();
В настоящее время X DevAPI не поддерживает использование никакой области
документа кроме неявного _id
как document ID.
Нет никакого способа определить другой document ID (первичный ключ).
find()
используется, чтобы получить документы
от базы данных. Это берет
SearchConditionStr
в качестве параметра, чтобы определить документы, которые должны быть
возвращены из базы данных. Несколько методов, например,
fields()
,
sort()
, skip()
и
limit()
могут быть применены в функции
find()
, чтобы далее уточнить результат.
fetch()
на самом деле вызывает выполнение
операции. Пример предполагает, что существует испытательная схема и
коллекция my_collection
.
MySQL Shell JavaScript Code
// Use the collection 'my_collection' var myColl = db.getCollection('my_collection'); // Find a single document that has a field 'name' starts with an 'L' var docs = myColl.find('name like :param'). limit(1).bind('param', 'L%').execute(); print(docs.fetchOne()); // Get all documents with a field 'name' that starts with an 'L' docs = myColl.find('name like :param'). bind('param','L%').execute(); var myDoc; while (myDoc = docs.fetchOne()) { print(myDoc); }
MySQL Shell Python Code
# Use the collection 'my_collection' myColl = db.get_collection('my_collection') # Find a single document that has a field 'name' starts with an 'L' docs = myColl.find('name like :param').limit(1).bind('param', 'L%').execute() print(docs.fetch_one()) # Get all documents with a field 'name' that starts with an 'L' docs = myColl.find('name like :param').bind('param','L%').execute() myDoc = docs.fetch_one() while myDoc: print(myDoc) myDoc = docs.fetch_one()
Node.js JavaScript Code
// Use the collection 'my_collection' var myColl = db.getCollection('my_collection'); // Find a single document that has a field 'name' that starts with an 'L' myColl .find('name like :name') .bind('name', 'L%') .limit(1) .execute(function (doc) { console.log(doc); }) .then(function () { // handle details }); // Get all documents with a field 'name' that starts with an 'L' myColl .find('name like :name') .bind('name', 'L%') .execute(function (doc) { console.log(doc); }) .then(function () { // handle details });
C# Code
// Use the collection "my_collection" var myColl = db.GetCollection("my_collection"); // Find a single document that has a field "name" starts with an "S" var docs = myColl.Find("name like :param").Limit(1). Bind("param", "L%").Execute(); Console.WriteLine(docs.FetchOne()); // Get all documents with a field "name" that starts with an "S" docs = myColl.Find("name like :param").Bind("param", "L%").Execute(); while (docs.Next()) { Console.WriteLine(docs.Current); }
Python Code
# Use the collection 'my_collection' my_coll = my_schema.get_collection('my_collection') # Find a single document that has a field 'name' starts with an 'L' docs = my_coll.find('name like :param').limit(1).bind('param', 'L%').execute() print(docs.fetch_one()) # Get all documents with a field 'name' that starts with an 'L' docs = my_coll.find('name like :param').bind('param', 'L%').execute() doc = docs.fetch_one() print(doc)
Java Code
// Use the collection 'my_collection' Collection myColl = db.getCollection("my_collection"); // Find a single document that has a field 'name' starts with an 'L' DocResult docs = myColl.find("name like :name").bind("name", "L%").execute(); System.out.println(docs.fetchOne()); // Get all documents with a field 'name' that starts with an 'L' docs = myColl.find("name like :name").bind("name", "L%").execute(); while (docs.hasNext()) { DbDoc myDoc = docs.next(); System.out.println(myDoc); }
C++ Code
// Use the collection 'my_collection' Collection myColl = db.getCollection("my_collection"); // Find a single document that has a field 'name' starts with an 'L' DocResult docs = myColl.find("name like :param"). limit(1).bind("param", "L%").execute(); cout << docs.fetchOne() << endl; // Get all documents with a field 'name' that starts with an 'L' docs = myColl.find("name like :param").bind("param","L%").execute(); DbDoc myDoc; while ((myDoc = docs.fetchOne())) { cout << myDoc << endl; }
Рис. 4.1. Collection.modify()
Рис. 4.2. Collection.remove()
Команды CRUD, рассмотренные в разделе 4.3, работают над группой документов в коллекции, которые соответствуют фильтру. X DevAPI также обеспечивает следующие операции, которые работают над едиными документами, которые определяются их document ID:
Collection.replaceOne(string id, Document doc)
обновляет или заменяет документ, определенный id, если это существует.
Collection.addOrReplaceOne(string id,
Document doc)
добавляет данный документ. Если id или какая-либо другая
область, у которой есть уникальный индекс, уже существует в коллекции,
операция вместо этого обновляет соответствующий документ.
Collection.getOne(string id)
возвращает документ с данным id. Это короткий путь для
Collection.find("_id = :id").bind("id",
id).execute().fetchOne()
.
Collection.removeOne(string id)
удаляет документ с данным id. Это короткий путь для
Collection.remove("_id = :id").bind("id", id).execute()
.
Используя эти операции вы можете ссылаться на документы по ID, делая операции на единых документах более простыми примерно так:
doc = collection.getOne(id); doc["address"] = "123 Long Street"; collection.replaceOne(id, doc);
Синтаксис операций по единому документу следующий:
Document getOne(string
, где
id
)id
это document ID документа, который будет
получен. Эта операция возвращает документ или
NULL
, если никакое соответствие не найдено.
Ищут документ, у которого есть данный
id
.
Result removeOne(string
, где
id
)id
это document ID удаляемого
документа. Эта операция возвращает Result
,
который указывает на количество удаленных документов (1 или 0, если ни
один не удален).
Result replaceOne(string
, где
id
, Document
doc
)id
это document ID
документа, который будет заменен,
doc
это новый документ, который
может содержать выражения. Если doc
содержит значение _id
,
это проигнорировано. Операция возвращает Result
,
который указывает на количество затронутых документов (1 или 0, если ни
одного). Берет объект документа, который заменяет соответствующий документ.
Если никакие соответствия не найдены, функция завершается
без внесенных изменений.
Result addOrReplaceOne(string id, Document doc)
,
где id
это document ID документа, который будет
заменен, а doc
это
новый документ, который может содержать выражения. Если
doc
содержит значение
_id
, это проигнорировано.
Эта операция возвращает Result
,
который указывает на количество затронутых документов (1 или 0,
если ни одного).
Эти операции принимают явное значение id
,
чтобы гарантировать, что любые изменения, сделанные операцией, применяются к
намеченному документу. Во многих скриптах документ
doc
мог прибыть от пользователя, которому не доверяют, который мог потенциально
изменить данные id
в документе и таким образом заменить другие документы.
Чтобы снизить этот риск, необходимо передать явный document
id
через безопасный канал.
Если doc
имеет значение для
_id
и это не соответствует данному
id
, тогда ошибка произведена.
Если в коллекции есть документ с данным document ID, коллекция проверяется на
любой документ, который находится в противоречии с уникальными ключами
doc
и где document ID
противоречивых документов не id
,
тогда ошибка произведена. Иначе существующий документ в коллекции заменяется
на doc
.
Если у коллекции есть какой-либо документ, который находится в противоречии с
уникальными ключами от doc
,
тогда ошибка произведена. Иначе doc
успешно добавляется к коллекции.
Document getOne(string
, где
id
)id
это document ID документа, который будет
получен. Эта операция возвращает документ или
NULL
, если ничего не нашлось.
Ищут документ, у которого есть данный
id
.
Result removeOne(string
, где
id
)id
это document ID
удаляемого документа. Эта операция возвращает
Result
, который указывает на количество
удаленных документов (1 или 0, если ни одного).