如何从mongodb的多个嵌套文档/多个子文档中过滤数据

时间:2021-02-18 06:33:39

标签: mongodb mongoose

这是我正在尝试的示例文档

{
    "_id" : "3",
    "description" : "DESCRIPTION ARTICLE AD",
    "article_code" : "AD",
    "purchase" : [
        {
            "company" : 1,
            "cost" : "70.010000"
        },
        {
            "company" : 2,
            "cost" : "75.820000"
        },
        {
            "company" : 3,
            "cost" : "69.910000"
        }
    ],
    "stock" : [
        {
            "country" : "01",
            "warehouse" : {
                "code" : "01",
                "units" : 5
            }
        },
        {
            "country" : "01",
            "warehouse" : {
                "code" : "02",
                "units" : 6
            }
        }
    ]
}

我的用例是我们有包含多个对象的文档,如股票和购买、userInfo、lang 用户说话等。我正在应用标准来获取 userInfo,其中用户名是 abc,用户角色是 admin 等。如果不匹配,只需忽略该特定条件。

我想得到低于purchase.company = 2 和stocks.warehouse.units = 6 的输出。

示例 OP1 ->

    "_id" : "3",
    "description" : "DESCRIPTION ARTICLE AD",
    "article_code" : "AD",
    "purchase" : [

        {
            "company" : 2,
            "cost" : "75.820000"
        }
    ],
    "stock" : [
        {
            "country" : "01",
            "warehouse" : {
                "code" : "02",
                "units" : 6
            }
        }
    ]
}

示例 OP2 ->

    "_id" : "3",
    "description" : "DESCRIPTION ARTICLE AD",
    "article_code" : "AD",
    "purchase" : [

        {
            "company" : 2,
            "cost" : "75.820000"
        }
    ],
    "stock" : [
        {
            "country" : "01",
            "warehouse" : {
                "units" : 6
            }
        }
    ]
}

1 个答案:

答案 0 :(得分:0)

您可以为此使用 Mongodb 的 aggregation framework

db.testdb.aggregate([
  {$match: {"purchase.company": 2 , "stock.warehouse.units" : 6}},
    { $project: {
    _id: 1,
    description: 1,
    article_code: 1,
    purchase: { $filter: {
      input: "$purchase",
      as: "purchase",
      cond: { $eq: ["$$purchase.company", 2] } } },
    stock: { $filter: {
      input: "$stock",
      as: "stock",
      cond: { $eq: ["$$stock.warehouse.units", 6] } } }
  } }
]).pretty()

如果你执行上面的查询,输出将是:

{
    "_id" : "3",
    "description" : "DESCRIPTION ARTICLE AD",
    "article_code" : "AD",
    "purchase" : [
        {
            "company" : 2,
            "cost" : "75.820000"
        }
    ],
    "stock" : [
        {
            "country" : "01",
            "warehouse" : {
                    "code" : "02",
                    "units" : 6
            }
        }
    ]
}