【问题标题】:How to return just the matched elements from a mongoDB array如何仅从 mongoDB 数组中返回匹配的元素
【发布时间】:2015-05-27 01:44:09
【问题描述】:

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

我有这个对象到我的 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 连接器制作 Java 程序,所以我确实需要一个 java 连接器查询,但我想如果我知道 mongo 查询,我就能得到它。

非常感谢!

【问题讨论】:

    标签: java arrays mongodb mongodb-query


    【解决方案1】:

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

    $unwind 运算符 - 通过解构为 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
    }
    

    【讨论】:

    • 非常感谢您!你的回答很有用!
    猜你喜欢
    • 2012-08-31
    • 2016-03-26
    • 2013-01-22
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    相关资源
    最近更新 更多