MongoDB - Запрос последнего элемента массива?

В вашем алгоритме вы можете использовать метод String.IndexOf и передать в OrdinalIgnoreCase в качестве параметра StringComparison.

21
задан KARTHIKEYAN.A 17 September 2018 в 06:37
поделиться

4 ответа

В 3.2 это возможно. Первый проект, чтобы myField содержал только последний элемент, а затем совпадал с myField.

db.collection.aggregate([
   { $project: { id: 1, myField: { $slice: [ "$myField", -1 ] } } },
   { $match: { myField: "myValue" } }
]);
19
ответ дан jdeyrup 17 September 2018 в 06:37
поделиться

использовать $ slice .

db.collection.find( {}, { array_field: { $slice: -1 } } )

Редактирование: Вы можете использовать { <field>: { $elemMatch: { <query1>, <query2>, ... } } }, чтобы найти совпадение.

Но это не даст именно то, что вы ищете. Я не думаю, что это возможно в mongoDB.

11
ответ дан KARTHIKEYAN.A 17 September 2018 в 06:37
поделиться

Вы можете использовать $ 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);
7
ответ дан user2683814 17 September 2018 в 06:37
поделиться

Версия 3.6 использует агрегацию для достижения того же.

db.getCollection('deviceTrackerHistory').aggregate([
   {
     $match:{clientId:"12"}
   },
   {
     $project:
      {
         deviceId:1,
         recent: { $arrayElemAt: [ "$history", -1 ] }
      }
   }
])
4
ответ дан KARTHIKEYAN.A 17 September 2018 в 06:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: