update objects inside array addtoset arrays mongodb mongoose mongodb-query spring-data-mongodb

arrays - objects - MongoDB-¿Consulta sobre el último elemento de una matriz?



mongoose update array (7)

En 3.2 esto es posible. Primer proyecto para que myField contenga solo el último elemento, y luego haga coincidir en myField.

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

Sé que MongoDB admite la sintaxis find{array.0.field:"value"} , pero específicamente quiero hacer esto para el último elemento de la matriz, lo que significa que no conozco el índice. ¿Hay algún tipo de operador para esto, o estoy fuera de suerte?

EDITAR: Para aclarar, quiero que find () solo devuelva documentos donde un campo en el último elemento de una matriz coincida con un valor específico.


No estoy seguro sobre el rendimiento, pero esto funciona bien para mí:

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


Podría usar $position: 0 cada vez que $push , y luego siempre consultar array.0 para obtener el elemento agregado más recientemente. Por supuesto, entonces, no podrá obtener el nuevo elemento "último".


Publiqué en el grupo oficial de Mongo Google here , y obtuve una respuesta de su personal. Parece que lo que busco no es posible. Sólo voy a utilizar un enfoque de esquema diferente.


Puede usar $expr (operador de la versión 3.6 mongo) para usar las funciones de agregación en una consulta regular.

Comparar query operators frente a aggregation comparison operators .

Para matrices escalares

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

Para matrices incrustadas: use la expresión $arrayElemAt con notación de puntos para proyectar el último elemento.

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

Código primavera @Query

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


use $ slice .

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

Edición: Puedes usar { <field>: { $elemMatch: { <query1>, <query2>, ... } } } para encontrar una coincidencia.

Pero no le dará exactamente lo que está buscando. No creo que sea posible en mongoDB todavía.


La versión 3.6 usa la agregación para lograr lo mismo.

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