RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Глава 4. Работа с коллекциями

Следующий раздел объясняет, как работать с коллекциями, как использовать операции CRUD на коллекциях и возвратить документы.

4.1. Основные операции 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");

4.2. Объекты коллекции

Документы того же самого типа группируются и хранятся в базе данных как коллекции. X DevAPI использует объекты коллекции, чтобы сохранить документы.

4.2.1. Создание коллекции

Чтобы создать новую коллекцию, вызовите функцию 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);

4.2.2. Работа с существующими коллекциями

Чтобы получить объект коллекции для существующей коллекции, сохраненной в базе данных, вызовите функцию 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, могут использоваться, чтобы создать новую или снова использовать существующую коллекцию с именем.

В большинстве случаев хорошая практика это создать объекты базы данных в течение времени разработки и воздержаться от создания их на лету во время производственной стадии проекта базы данных. Поэтому лучше отделять код, который создает коллекции в базе данных, от кода пользовательского приложения.

4.2.3. Индексация коллекций

Чтобы сделать большое количество документов более эффективным, может помочь создание индекса на основе одного или более полей, найденных в документах в коллекции. Этот раздел описывает, как внести индекс в коллекцию.

Создание индекса

Индексы коллекции это обычные индексы 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.

Типы данных полей

Следующие типы данных поддерживаются для областей документа. Описания типа нечувствительны к регистру.

Индексация областей множества

Для MySQL 8.0.17 и выше X DevAPI поддерживает индексы на основе областей множества, устанавливая поле array = true в IndexField. Например, чтобы создать индекс на области множества emails:

collection.createIndex("emails_idx", //
                       {fields: [{"field": "$.emails",
                       "type":"CHAR(128)", "array": true}]});

Следующие ограничения относятся к созданию индексов на основе множеств:

  • Для каждого индекса только одна индексируемая область может быть array.

  • Типы данных, для которых может быть создан индекс на множествах:

    • Числовые: INTEGER [UNSIGNED] (INT не поддерживается).

    • Типы с фиксированной точкой: DECIMAL(m, n) (точность и масштаб обязательны).

    • Типы даты и времени: DATE, TIME и DATETIME.

    • Строковые типы: CHAR(n) и BINARY(n), символ или байт длины n обязательны (TEXT не поддерживается).

4.3. Обзор функций CRUD для коллекций

Следующий раздел объясняет отдельные функции объекта коллекции.

Наиболее распространенные операции, которые будут выполнены на коллекции, являются Create, Read, Update, Delete (CRUD). Чтобы ускорить операции поиска, рекомендуется сделать надлежащее использование индексов.

Collection.add()

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 (первичный ключ).

Collection.find()

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;
}

Collection.modify()

Рис. 4.1. Collection.modify()

Content is described in the surrounding text.

Collection.remove()

Рис. 4.2. Collection.remove()

Content is described in the surrounding text.

4.4. Операции по единому документу

Команды 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, если ни одного).

Поиск

 

Найди своих коллег!

Вы можете направить письмо администратору этой странички, Алексею Паутову. mailto:alexey.v.pautov@mail.ru