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

Java 如何仅从mongoDB数组返回匹配的元素,java,arrays,mongodb,mongodb-query,Java,Arrays,Mongodb,Mongodb Query,我一直在寻找这个问题一个星期,我不明白为什么它仍然不工作 我已将此对象保存到我的MongoDB数据库中: { produc: [ { cod_prod: "0001", description: "Ordenador", price: 400, current_stock: 3, min_sto

我一直在寻找这个问题一个星期,我不明白为什么它仍然不工作

我已将此对象保存到我的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_区域(“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连接器制作一个Java程序,所以我确实需要一个Java连接器查询,但我想如果我知道mongo查询,我将能够得到它


非常感谢你

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

运算符-通过解构,为
produc
数组字段中的每个元素输出文档

操作员将仅筛选符合
cod_zone
条件的文档

操作员将按指定的标识符表达式对输入文档进行分组,并将累加器表达式应用于每个组:

操作员然后重建流中的每个文档:

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
}

非常感谢你,克丽达姆!你的回答很有用!