web-dev-qa-db-fra.com

MongoDB - Requête sur le dernier élément d'un tableau?

Je sais que MongoDB prend en charge la syntaxe find{array.0.field:"value"}, mais je veux spécifiquement le faire pour le dernier élément du tableau, ce qui signifie que je ne connais pas l'index. Y a-t-il une sorte d'opérateur pour cela, ou n'ai-je pas de chance?

EDIT: pour clarifier, je veux que find () renvoie uniquement les documents où un champ dans le dernier élément d'un tableau correspond à une valeur spécifique.

24
Joseph Blair

J'ai posté sur le groupe officiel Mongo Google ici , et j'ai obtenu une réponse de leur personnel. Il semble que ce que je recherche n'est pas possible. Je vais simplement utiliser une approche de schéma différente.

13
Joseph Blair

En 3.2, cela est possible. Projetez d'abord afin que myField ne contienne que le dernier élément, puis faites correspondre sur myField.

db.collection.aggregate([
   { $project: { id: 1, myField: { $slice: [ "$myField", -1 ] } } },
   { $match: { myField: "myValue" } }
]);
21
jdeyrup

utilisez $ slice.

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

Modification: vous pouvez utiliser { <field>: { $elemMatch: { <query1>, <query2>, ... } } } pour trouver une correspondance.

Mais cela ne vous donnera pas exactement ce que vous recherchez. Je ne pense pas que ce soit encore possible dans mongoDB.

12
Kaushal

Vous pouvez utiliser $ expr (opérateur de version 3,6 mongo) pour utiliser les fonctions d'agrégation dans les requêtes régulières.

Comparer query operators vs aggregation comparison operators .

Pour les tableaux scalaires

db.col.find({$expr:{$gt:[{$arrayElemAt:["array", -1]}, value]}})

Pour les tableaux intégrés - Utilisez $arrayElemAt expression avec notation par points pour projeter le dernier élément.

db.col.find({$expr:{$gt:[{"$arrayElemAt": ["$array.field", 0]}, value]}})

Printemps @Query code

@Query("{$expr:{$gt:[{$arrayElemAt:[\"array\", -1]}, ?0]}}")
ReturnType MethodName(ArgType arg);
8
user2683814

Pas sûr de la performance, mais cela fonctionne bien pour moi:

db.getCollection('test').find(
  {
    $where: "this.someArray[this.someArray.length - 1] === 'pattern'"
  }
)
7
Ramil Muratov

Vous pouvez utiliser $position: 0 chaque fois que vous $Push, puis interrogez toujours array.0 pour obtenir le dernier élément ajouté. Bien sûr, vous ne pourrez pas obtenir le nouvel "dernier" élément.

5
Ricky

Version 3.6 utilisez l'agrégation pour obtenir le même résultat.

db.getCollection('deviceTrackerHistory').aggregate([
   {
     $match:{clientId:"12"}
   },
   {
     $project:
      {
         deviceId:1,
         recent: { $arrayElemAt: [ "$history", -1 ] }
      }
   }
])
4
KARTHIKEYAN.A