Оператор проекции MongoDB - $ elemMatch
Описание
В MongoDB оператор проекции $ elemMatch используется для ограничения содержимого поля массива, включенного в результаты запроса, чтобы оно содержало только первый соответствующий элемент в массиве в соответствии с заданным условием.
Элементы массива обрабатываются как документ.
Если несколько элементов совпадают с оператором $ elemMatch, то только первый соответствующий элемент может отображаться в результате.
Имя нашей базы данных - «myinfo», а имя нашей коллекции - «mediitem2». Вот коллекция ниже.
Коллекция образцов "mediitem2"
{
"_id" : 1,
"batch" : 10452,
"tran_details" : [
{
"qty" : 200,
"prate" : 50,
"mrp" : 70
},
{
"qty" : 250,
"prate" : 50,
"mrp" : 60
},
{
"qty" : 190,
"prate" : 55,
"mrp" : 75
}
]
}
{
"_id" : 2,
"batch" : 73292,
"tran_details" : [
{
"qty" : 210,
"prate" : 54,
"mrp" : 64
},
{
"qty" : 225,
"prate" : 60,
"mrp" : 68
}
]
}
{
"_id" : 3,
"batch" : 10452,
"tran_details" : [
{
"qty" : 185,
"prate" : 57,
"mrp" : 68
},
{
"qty" : 200,
"prate" : 57,
"mrp" : 65
}
]
}
{
"_id" : 4,
"batch" : 10452,
"tran_details" : [
{
"qty" : 185,
"prate" : 50,
"mrp" : 68
}
]
}
Пример 1
Следующая операция mongodb find () запрашивает все документы из коллекции, где значение поля пакета равно 10452. Проекция $ elemMatch возвращает только первый соответствующий элемент (хотя он соответствует более чем одному элементу) массива tran_details, где находится поле prate. имеет значение 50.
db.mediitem2.find( { batch: 10452 },{ tran_details: { $elemMatch: { prate: 50 } } } ).pretty();
Примечание. Метод find () отображает документы в неструктурированном формате, но для отображения результатов в отформатированном виде можно использовать метод pretty ().
Вывод команды:
{ "_id": 1, "tran_details": [ { кол-во: 200, "prate": 50, mrp: 70 } ] } {"_id": 3} { "_id": 4, "tran_details": [ { «Кол-во»: 185, "prate": 50, mrp: 68 } ] }
Вот в приведенном выше примере
- для документа с _id, равным 1, массив tran_details содержит несколько элементов с полем prate, равным 50. Однако проекция $ elemMatch возвращает только первый соответствующий элемент из массива.
- Документ с _id, равным 3, не содержит поле tran_details в результате, что ни один элемент не соответствует условию $ elemMatch.
- и для документа с _id, равным 4, массив tran_details содержит только элементы с полем prate, равным 50.
Пример 2
Следующая операция find () запрашивает все документы, в которых значение поля пакета равно 10452. Проекция включает первый соответствующий элемент массива tran_details, где поле prate имеет значение 50, а поле mrp больше, чем равно 70 ,
> db.mediitem2.find({batch: 10452 },{tran_details: {$elemMatch: {prate: 50, mrp: {$gte: 70}}}}).pretty();
Вывод команды:
{ "_id": 1, "tran_details": [ { кол-во: 200, "prate": 50, mrp: 70 } ] } {"_id": 3} {"_id": 4}
Вот в приведенном выше примере
- для документа с _id, равным 1, массив tran_details содержит несколько элементов с полем prate, равным 50, и mrp, большим, чем равным 70. Однако проекция $ elemMatch возвращает только первый соответствующий элемент из массива.
- Документ с _id, равным 3 и 4, не содержит поля tran_details в результате, что ни один элемент не соответствует условию $ elemMatch.
Пример 3: оператор проекции MongoDB - $ elemMatch с сортировкой
Если поле массива содержит несколько документов с одним и тем же именем поля, то для сортировки повторяющегося поля в определенном порядке можно использовать метод sort () и метод find ().
Следующая операция mongodb find () запрашивает все документы из коллекции, где значение поля пакета равно 10452. Проекция $ elemMatch возвращает только первый соответствующий элемент (хотя он соответствует более чем одному элементу) массива tran_details, где находится поле prate. имеет значение 50, и результирующий набор будет располагаться в порядке возрастания в соответствии с полем или кол-во.
> db.mediitem2.find({ batch: 10452 },{ tran_details: { $elemMatch: { prate: 50 }}}).sort({"tran_details.qty":1}).pretty();
Примечание. Метод find () отображает документы в неструктурированном формате, но для отображения результатов в отформатированном виде можно использовать метод pretty ().
Вывод команды:
{"_id": 3} { "_id": 4, "tran_details": [ { «Кол-во»: 185, "prate": 50, mrp: 68 } ] } { "_id": 1, "tran_details": [ { кол-во: 200, "prate": 50, mrp: 70 } ] }
Новый контент: Composer: менеджер зависимостей для PHP , R программирования