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.
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.
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" } }
]);
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.
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);
Pas sûr de la performance, mais cela fonctionne bien pour moi:
db.getCollection('test').find(
{
$where: "this.someArray[this.someArray.length - 1] === 'pattern'"
}
)
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.
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 ] }
}
}
])