mongodb在父和子字段上嵌入文档搜索

时间:2014-07-29 15:30:40

标签: mongodb

我有一个嵌套的嵌入式文档,下面的CompanyProduct是结构

{
    "_id" : ObjectId("53d213c5ddbb1912343a8ca3"),
    "CompanyID" : 90449,
    "Name" : Company1,
    "CompanyDepartment" : [ 
        {
            "_id" : ObjectId("53d213c5ddbb1912343a8ca4")
            "DepartmentID" : 287,
            "DepartmentName" : "Stores",
            "DepartmentInventory" : [ 
                {
                    "_id" : ObjectId("53b7b92eecdd765430d763bd"),
                    "ProductID" : 1,
                    "ProductName" : "abc",
                    "Quantity" : 100
                },
                {
                    "_id" : ObjectId("53b7b92eecdd765430d763bd"),
                    "ProductID" : 2,
                    "ProductName" : "xyz",
                    "Quantity" : 1
                }
            ],
        }
    ],
}

可以有N个公司,每个公司可以有N个部门,每个部门可以有N个产品。

我想搜索一下特定公司的特定产品数量

我尝试了下面的查询,但它不起作用。它返回特定公司的所有产品,少于20的条件不起作用。

db.CompanyProduct.find({$and : [{"CompanyDepartment.DepartmentInventory.Quantity":{$lt :20}},{"CompanyID":90449}]})

查询应该如何?

2 个答案:

答案 0 :(得分:0)

您正在从companyProduct的子文档中搜索。所以它将返回你的companyProduct整个文件,它是NoSQL数据库,有些我们不需要规范化集合,但你的情况它必须规范化,就像你想要编辑/删除任何子文档,如果有千元或者数百万的子文件然后你会做什么...你需要在CompanyDepartment和companyProduct集合上使用名称进行其他收集

productCompany

{
    "_id" : ObjectId("53d213c5ddbb1912343a8ca3"),
    "CompanyID" : 90449,
    "Name" : Company1,
    "CompanyDepartment" : ['53d213c5ddbb1912343a8ca4'],
 }

和其他收集公司部门

   {
        "_id" : ObjectId("53d213c5ddbb1912343a8ca4")
        "DepartmentID" : 287,
        "DepartmentName" : "Stores",
        "DepartmentInventory" : [ 
            {
                "_id" : ObjectId("53b7b92eecdd765430d763bd"),
                "ProductID" : 1,
                "ProductName" : "abc",
                "Quantity" : 100
            },
            {
                "_id" : ObjectId("53b7b92eecdd765430d763bd"),
                "ProductID" : 2,
                "ProductName" : "xyz",
                "Quantity" : 1
            }
        ],
    }

在此之后,你得到了一系列公司的解决方案。 ID和仅推送和拉取查询将用于productCompany

答案 1 :(得分:0)

解决方案可以

db.YourCollection.aggregate([
{
    $project:{
        "CompanyDepartment.DepartmentInventory":1,
        "CompanyID" : 1
    }
},{ 
    $unwind: "$CompanyDepartment"
},{ 
    $unwind: "$CompanyDepartment.DepartmentInventory"
},{    
    $match:{$and : [{"CompanyDepartment.DepartmentInventory.Quantity":{$lt :20}},{"CompanyID":90449}]}    
}

])

结果是

{
    "result" : [ 
        {
            "_id" : ObjectId("53d213c5ddbb1912343a8ca3"),
            "CompanyID" : 90449,
            "CompanyDepartment" : {
                "DepartmentInventory" : {
                    "_id" : ObjectId("53b7b92eecdd765430d763bd"),
                    "ProductID" : 2,
                    "ProductName" : "xyz",
                    "Quantity" : 1
                }
            }
        }
    ],
    "ok" : 1
}