4.3.2 Collection.find()
Функция find( предназначена для поиска документов в коллекции, аналогично оператору запроса в базе данных SQL. Она принимает строку условия поиска (SearchConditionStr) в качестве параметра, чтобы указать, какие документы должны быть возвращены из базы данных. Функция SearchConditionStr)execute() запускает фактическое выполнение операции find().
Строка условия поиска (SearchConditionStr) может иметь один из следующих форматов:
-
Если строка условия поиска (SearchConditionStr) не указана, операция
find()возвращает все документы в коллекции.// Get a collection var myColl = session.getSchema("world_x").getCollection("countryinfo"); // To return all documents in world_x: myColl.find().execute(); -
Наиболее распространенный формат для строки условия поиска (SearchConditionStr) следующий:
JSON-path[operator{value|JSON-path} ]Ниже приведены объяснения различных частей строки условия поиска (SearchConditionStr):
-
JSON-path: Путь JSON определяет элемент в JSON-документе; см. для получения подробностей. Вот краткое изложение синтаксиса путей JSON:-
Путь JSON начинается со области действия: в реализации JSON-документов MySQL область действия пути всегда является документом, над которым выполняется операция, представленная как
$, которая всегда подразумевается неявно, поэтому ее можно пропустить в большинстве случаев; например, путь$.geography.Regionэквивалентен путиgeography.Region.ПримечаниеВ некоторых случаях
$нельзя опускать; например:Когда используется символ подстановки
**(например,find("$**.b1"); см. обсуждение символов подстановки ниже),Когда путь JSON содержит только строковую литерал, если
$опущен (например,find("$.'country_name'")для поиска всех документов, имеющих полеcountry name).
После области действия путь состоит из одного или нескольких сегментов пути. Сегмент пути переходит с одного уровня JSON-дерева на следующий, а последовательные сегменты разделены точкой (
.). Например:myColl.find("geography.Continent = 'Africa'")находит все документы, имеющие значениеAfricaдля поляContinentв полеgeography.-
Элементы в массивах представляются как
[, гдеN]N— индекс массива, который должен быть неотрицательным целым числом.myColl.add({ name:'John', favorNums: [1, 3, 5, 7, 9] }).execute(); myColl.find("favorNums[0] = 1").execute(); //Returns the document just added }
-
-
В путях JSON можно использовать символы подстановки
*и**следующим образом:представляет значения всех членов под членомobject.*object. Например, в коллекцииcountryinfoв образце схемыworld_x,geography.*представляет все члены под объектомgeography, иmyColl.find("'Africa' in geography.*")возвращает все документы, имеющие значениеAfricaв любом из членов подgeography.-
представляет значения всех элементов в массиве. Например:array[*]myColl.add({ name:'John', favorNums: [1, 3, 5, 7, 9] }).execute(); myColl.add({ name:'Jane', favorNums: [2, 4, 6, 8, 10] }).execute(); myColl.find("1 in favorNums[*]").execute(); //Returns the first document added above myColl.find("2 in favorNums[*]").execute(); //Returns the second document added above } -
[представляет все пути под документомprefix]**suffixprefix, которые заканчиваются наsuffix, независимо от глубины пути. Следующие примеры иллюстрируют, как ** может быть использован для получения различных результатов:mysql-js>
myColl.find().execute();{ "a": "bar", "b": { "b1": 6, "b2": 7, "b3": { "b1": 99, "b2": 98, "b3": { "b1": 999, "b2": 998 } } }, "_id": "000061313aa10000000000000001" } { "a": "baz", "b": { "b1": 1, "b2": 7 }, "_id": "000061313aa10000000000000002" } { "a": "bbr", "c": 37, "_id": "0000613247ed0000000000000001" } 3 documents in set (0.0007 sec) mysql-js>myColl.find("$**.b2").execute();{ "a": "bar", "b": { "b1": 6, "b2": 7, "b3": { "b1": 99, "b2": 98, "b3": { "b1": 999, "b2": 998 } } }, "_id": "000061313aa10000000000000001" } { "a": "baz", "b": { "b1": 1, "b2": 7 }, "_id": "000061313aa10000000000000002" } 2 documents in set, 1 warning (0.0008 sec) ... mysql-js>myColl.find("$**.b3**.b2").execute();{ "a": "bar", "b": { "b1": 6, "b2": 7, "b3": { "b1": 99, "b2": 98, "b3": { "b1": 999, "b2": 998 } } }, "_id": "000061313aa10000000000000001" } 1 document in set, 1 warning (0.0011 sec) ...При использовании символа подстановки
**применяются следующие требования:prefixдолжно быть$или элементом, являющимся документом.suffixдолжно быть сегментом пути и всегда требуется (т. е. выражение пути не может заканчиваться на**).Выражение пути не может содержать последовательность
***.
-
value— значение, которое должно быть сравнено с элементом вJSON-path. Символы подстановки%и_могут быть использованы вvalueс операторомLIKE, как и в предложении MySQLWHERE. Например:myColl.find("Name LIKE 'Austra%'") myColl.find("geography.Continent LIKE 'Asi_'") -
operator: В строке условия поиска (SearchConditionStr) можно использовать следующие операторы:OR (||),AND (&&),XOR,IS,NOT,BETWEEN,IN,LIKE,OVERLAPS,!=,<>,>,>=,<,<=,&,|,<<,>>,+,-,*,/,~и%. Вот некоторые примеры использования операторов:myColl.find("Name = 'Australia'") myColl.find("demographics.Population >= 1000000" ) myColl.find("demographics.LifeExpectancy BETWEEN 50 AND 60") myColl.find("government.HeadOfState = 'Elizabeth II' AND geography.Region = 'Caribbean'")Если оператор и последующий путь JSON не указаны,
find()возвращает все документы, для которых путь JSON указывает на некоторые непустые элементы. Например:myColl.find("demographics.Population" ).execute();Возвращает все документы, которые имеют элемент
demographics.Population:{ "GNP": 828, "_id": "00005de917d80000000000000000", "Code": "ABW", "Name": "Aruba", "IndepYear": null, "geography": { "Region": "Caribbean", "Continent": "North America", "SurfaceArea": 193 }, "government": { "HeadOfState": "Beatrix", "GovernmentForm": "Nonmetropolitan Territory of The Netherlands" }, "demographics": { "Population": 103000, "LifeExpectancy": 78.4000015258789 } } { "GNP": 5976, "_id": "00005de917d80000000000000001", ... 232 documents in set, 1 warning (0.0013 sec) Warning (code 3986): Evaluating a JSON value in SQL boolean context does an implicit comparison against JSON integer 0; if this is not what you want, consider converting JSON to an SQL numeric type with JSON_VALUE RETURNINGИспользуйте оператор
INв строке условия поиска (SearchConditionStr), чтобы проверить значение внутри всех членов, охватываемых символом подстановки:mysql-js>
myColl.find("$**.b1").execute();{ "a": "bar", "b": { "b1": 6, "b2": 7, "b3": { "b1": 99, "b2": 98, "b3": { "b1": 999, "b2": 998 } } }, "_id": "000061313aa10000000000000001" } { "a": "baz", "b": { "b1": 1, "b2": 7 }, "_id": "000061313aa10000000000000002" } 2 documents in set, 1 warning (0.0012 sec) ... mysql-js>myColl.find("99 IN $**.b1").execute();{ "a": "bar", "b": { "b1": 6, "b2": 7, "b3": { "b1": 99, "b2": 98, "b3": { "b1": 999, "b2": 998 } } }, "_id": "000061313aa10000000000000001" } 1 document in set (0.0016 sec) ...Оператор
OVERLAPSсравнивает два JSON-фрагмента и возвращает true (1), если два фрагмента имеют общие значения в любой паре ключ-значение или элементе массива. Например:mysql-js>
myColl.find("list").execute();{ "_id": "1", "list": [ 1, 4 ] } { "_id": "2", "list": [ 4, 7 ] } 2 documents in set, 1 warning (0.0010 sec) mysql-js>myColl.find("[1,2,3] OVERLAPS $.list"){ "_id": "1", "list": [ 1, 4 ] } 1 document in set (0.0006 sec)
-
Несколько методов, таких как fields(), sort() и limit(), можно связать с функцией find() для дальнейшей уточнения результата. Например:
myColl.find("Name LIKE 'Austra%'").fields("Code")
myColl.find("geography.Continent LIKE 'A%'").limit(10) Также поддерживается привязка параметров с помощью bind(). Следующий пример иллюстрирует использование bind() с find():
Код MySQL Shell JavaScript
// Use the collection 'my_collection'
var myColl = db.getCollection('my_collection');
// Find a single document that has a field 'name' that starts with '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 'L'
docs = myColl.find('name like :param').
bind('param','L%').execute();
var myDoc;
while (myDoc = docs.fetchOne()) {
print(myDoc);
}
Код MySQL Shell Python
# Use the collection 'my_collection'
myColl = db.get_collection('my_collection')
# Find a single document that has a field 'name' that starts with '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 '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
// Use the collection 'my_collection'
var myColl = db.getCollection('my_collection');
// Find a single document that has a field 'name' that starts with '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 'L'
myColl
.find('name like :name')
.bind('name', 'L%')
.execute(function (doc) {
console.log(doc);
})
.then(function () {
// handle details
});
Код C#
// Use the collection "my_collection"
var myColl = db.GetCollection("my_collection");
// Find a single document that has a field "name" that starts with "L"
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 "L"
docs = myColl.Find("name like :param")
.Bind("param", "L%").Execute();
while (docs.Next())
{
Console.WriteLine(docs.Current);
}
Код Python
# Use the collection 'my_collection'
my_coll = my_schema.get_collection('my_collection')
# Find a single document that has a field 'name' that starts with '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 'L'
docs = my_coll.find('name like :param').bind('param', 'L%').execute()
doc = docs.fetch_one()
print(doc)
Код Java
// Use the collection 'my_collection'
Collection myColl = db.getCollection("my_collection");
// Find a single document that has a field 'name' that starts with '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 'L'
docs = myColl.find("name like :name").bind("name", "L%").execute();
while (docs.hasNext()) {
DbDoc myDoc = docs.next();
System.out.println(myDoc);
}
Код C++
// Use the collection 'my_collection'
Collection myColl = db.getCollection("my_collection");
// Find a single document that has a field 'name' that starts with '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 'L'
docs = myColl.find("name like :param")
.bind("param","L%").execute();
DbDoc myDoc;
while ((myDoc = docs.fetchOne()))
{
cout << myDoc << endl;
}
См. также CollectionFindFunction для синтаксиса find() в EBNF.
© 2025 Oracle
Licensed under the GPLv2 License.