如何从mongoDB数组中返回匹配的元素

我一直在寻找这个问题一周,我无法理解为什么它仍然无效……

我有这个对象到我的MongoDB数据库:

{ produc: [ { cod_prod: "0001", description: "Ordenador", price: 400, current_stock: 3, min_stock: 1, cod_zone: "08850" }, { cod_prod: "0002", description: "Secador", price: 30, current_stock: 10, min_stock: 2, cod_zone: "08870" }, { cod_prod: "0003", description: "Portatil", price: 500, current_stock: 8, min_stock: 4, cod_zone: "08860" }, { cod_prod: "0004", description: "Disco Duro", price: 100, current_stock: 20, min_stock: 5, cod_zone: "08850" }, { cod_prod: "0005", description: "Monitor", price: 150, current_stock: 0, min_stock: 2, cod_zone: "08850" } ] } 

我想查询具有特定cod_zone(“08850”)的数组元素。

我发现$ elemMatch投影应该只返回与查询匹配的数组元素,但我不知道为什么我得到所有对象。

这是我正在使用的查询:

 db['Collection_Name'].find( { produc: { $elemMatch: { cod_zone: "08850" } } } ); 

这是我期望的结果:

 { produc: [ { cod_prod: "0001", denominacion: "Ordenador", precio: 400, stock_actual: 3, stock_minimo: 1, cod_zona: "08850" },{ cod_prod: "0004", denominacion: "Disco Duro", precio: 100, stock_actual: 20, stock_minimo: 5, cod_zona: "08850" }, { cod_prod: "0005", denominacion: "Monitor", precio: 150, stock_actual: 0, stock_minimo: 2, cod_zona: "08850" }] } 

我正在使用MongoDB Java Connector创建一个Java程序,所以我真的需要查询java连接器,但我想如果我知道mongo查询,我将能够得到它。

非常感谢!

这可以通过聚合框架实现 。 管道通过以下操作传递集合中的所有文档:

$unwind operator – 通过解构它为produc数组字段中的每个元素输出一个文档。

$match运算符将仅过滤符合cod_zone条件的文档。

$group运算符将按指定的标识符表达式对输入文档进行分组,并将累加器表达式$push应用于每个组:

$project运算符然后重建流中的每个文档:

 db.collection.aggregate([ { "$unwind": "$produc" }, { "$match": { "produc.cod_zone": "08850" } }, { "$group": { "_id": null, "produc": { "$push": { "cod_prod": "$produc.cod_prod", "description": "$produc.description", "price" : "$produc.price", "current_stock" : "$produc.current_stock", "min_stock" : "$produc.min_stock", "cod_zone" : "$produc.cod_zone" } } } }, { "$project": { "_id": 0, "produc": 1 } } ]) 

将产生:

 { "result" : [ { "produc" : [ { "cod_prod" : "0001", "description" : "Ordenador", "price" : 400, "current_stock" : 3, "min_stock" : 1, "cod_zone" : "08850" }, { "cod_prod" : "0004", "description" : "Disco Duro", "price" : 100, "current_stock" : 20, "min_stock" : 5, "cod_zone" : "08850" }, { "cod_prod" : "0005", "description" : "Monitor", "price" : 150, "current_stock" : 0, "min_stock" : 2, "cod_zone" : "08850" } ] } ], "ok" : 1 }