В вашем алгоритме вы можете использовать метод String.IndexOf и передать в OrdinalIgnoreCase в качестве параметра StringComparison.
В 3.2 это возможно. Первый проект, чтобы myField содержал только последний элемент, а затем совпадал с myField.
db.collection.aggregate([
{ $project: { id: 1, myField: { $slice: [ "$myField", -1 ] } } },
{ $match: { myField: "myValue" } }
]);
использовать $ slice .
db.collection.find( {}, { array_field: { $slice: -1 } } )
Редактирование: Вы можете использовать { <field>: { $elemMatch: { <query1>, <query2>, ... } } }
, чтобы найти совпадение.
Но это не даст именно то, что вы ищете. Я не думаю, что это возможно в mongoDB.
Вы можете использовать $ expr (оператор версии 3.6 mongo), чтобы использовать функции агрегирования в обычном запросе.
Сравнить query operators
и aggregation comparison operators
.
Для скалярных массивов
db.col.find({$expr:{$gt:[{$arrayElemAt:["array", -1]}, value]}})
Для встроенных массивов - используйте выражение $arrayElemAt
с точечной нотацией для проецирования последнего элемента.
db.col.find({$expr:{$gt:[{"$arrayElemAt": ["$array.field", 0]}, value]}})
Пружина @Query
код
@Query("{$expr:{$gt:[{$arrayElemAt:[\"array\", -1]}, ?0]}}")
ReturnType MethodName(ArgType arg);
Версия 3.6 использует агрегацию для достижения того же.
db.getCollection('deviceTrackerHistory').aggregate([
{
$match:{clientId:"12"}
},
{
$project:
{
deviceId:1,
recent: { $arrayElemAt: [ "$history", -1 ] }
}
}
])