Tengo un esquema como este:
const AyoSchema = new Schema({ images: Array,Imágenes es una matriz en la que los objetos se almacenan en dicho formato:
{ id: a uuid here, name: a string here, url: a url here, topic: a string here }Lo que quiero hacer es buscar la propiedad de nombre de todos los objetos en la matriz de imágenes sin involucrar mucho trabajo de índices,
¿Cómo debo hacer?
Hay un par de formas en las que podrías manejarlo. Si desea devolver solo los documentos coincidentes, es un poco más complicado.
Supongo que desea devolver solo los artículos coincidentes. Para hacerlo, deberá usar la canalización de agregación, específicamente los operadores $unwind y $match.
Vea una demostración en vivo aquí
Considera lo siguiente:
[ { _id: ObjectId("111111111111111111111111"), images: [ { id: ObjectId("123123224454323123121314"), name: "foo", url: "cdn.domain.com/images/foo", topic: "lorem ipsum" }, { id: ObjectId("222123224454323123121314"), name: "bar", url: "cdn.domain.com/images/bar", topic: "lorem ipsum" }, { id: ObjectId("333323224454323123121314"), name: "baz", url: "cdn.domain.com/images/baz", topic: "lorem ipsum" } ] }, { _id: ObjectId("222222222222222222222222"), images: [ { id: ObjectId("888823224454323123121314"), name: "text", url: "cdn.domain.com/images/text", topic: "lorem ipsum" }, { id: ObjectId("999993224454323123121314"), name: "foo", url: "cdn.domain.com/images/pic", topic: "lorem ipsum" } ] } ] db.collection.aggregate([ { $unwind: "$images" }, { $match: { "images.name": "foo" // <-- replace "foo" with your query } } ]) [ { "_id": ObjectId("111111111111111111111111"), "images": { "id": ObjectId("123123224454323123121314"), "name": "foo", "topic": "lorem ipsum", "url": "cdn.domain.com/images/foo" } }, { "_id": ObjectId("222222222222222222222222"), "images": { "id": ObjectId("999993224454323123121314"), "name": "foo", "topic": "lorem ipsum", "url": "cdn.domain.com/images/pic" } } ]Para incluir expresiones regulares.
db.collection.aggregate([ { $unwind: "$images" }, { $match: { "images.name": { "$regex": "fo*" } } } ])