Utilizo el repositorio Java Spring y MongoDB en mi proyecto.
Aquí está la definición de DTO:
@Document(collection = "Info") public class Info { String id, Integer count, String type … }Necesito devolver de la consulta una lista de ID donde el campo de conteo no es cero y el tipo archivado tiene texto 'binario'.
Aquí cómo trato de implementarlo:
@Query(value="{ 'count' : 0, 'type' : 'binary' }", fields="{ 'id' : 1 }") List<String> getInfo();Obtengo este resultado de la consulta anterior:
0={"_id": {"$oid": "5eb97a8139d4c62be4d90e4c"}} 1={"_id": {"$oid": "3ec97a8127d4c60cb4d90e9e"}}Y espero este resultado:
{"5eb97a8139d4c62be4d90e4c", "3ec97a8127d4c60cb4d90e9e"}Entonces, como puede ver, espero obtener una lista de cadenas de identificación de la consulta anterior.
¿Alguna idea de qué debo cambiar en la consulta anterior para obtener la lista esperada de resultados de ID?
No, eso es imposible lo que estás pensando.
Motivo: MongoDB solo puede devolver documentos JSON . Puede incluir los campos que desea que estén allí.
Esta sugerencia que puedes seguir:
Definición DTO:
@Document(collection = "Info") public class Info { @Id private String id; private Integer count; private String type; // other fields and getters and setters }Repositorio de muestras:
public interface InfoRepository extends MongoRepository<Info, String> { @Query(value="{ 'count' : 0, 'type' : 'binary' }", fields="{ 'id' : 1 }") List<Info> getInfo(); }Clase de servicio de muestra:
@Service public class InfoService { @Autowired private InfoRepository infoRepository; public List<String> getIds() { return infoRepository.getInfo() .stream() .map(Info::getId) .collect(Collectors.toList()); } }El {"$oid": "5eb97a8139d4c62be4d90e4c"} es la representación MongoDB Extended JSON de un ObjectID.
No devuelve una cadena porque el campo almacenado en la base de datos es de tipo ObjectID , no de tipo String .
Si desea que devuelva una cadena, debe usar la agregación con el operador $toString para convertirla.
lo mejor que puede obtener es un documento con un campo de matriz con los identificadores encontrados como este:
{ "ids" : [ "606018909fb6351e4c34f964", "606018909fb6351e4c34f965" ] }que se puede lograr con una consulta de agregación como esta:
db.Info.aggregate([ { $match: { count: 0, type: "binary" } }, { $project: { _id: { $toString: "$_id" } } }, { $group: { _id: null, ids: { $push: "$_id" } } }, { $project: { _id: 0 } } ])