如何检索文档以及其中的一个子文档?

时间:2020-04-01 20:08:06

标签: mongodb

我有一个类似于以下文件

{"_id":{"$oid":"5e7b6cb9606503483494c63a"},"ProductId":{"$binary":{"base64":"V9+9bOaj8kyWrPwdAm0rBQ==","subType":"03"}},"ProductName":"TestProduct1","ProductItems":[{"_t":"ProductItem","ProductId":{"$binary":{"base64":"V9+9bOaj8kyWrPwdAm0rBQ==","subType":"03"}},"Code":"TP1A"},
{"_t":"ProductItem","ProductId":{"$binary":{"base64":"V9+9bOaj8kyWrPwdAm0rDE==","subType":"03"}},"Code":"TP1B"}]}

我想做的是通过对ProductItem.Code的查询返回,该查询返回具有单个匹配子productproduct的产品。因此,保留了对象结构,但消除了除单个匹配子对象之外的所有子对象。

这是可能的还是我需要做两个查询,然后在客户端组合对象?

1 个答案:

答案 0 :(得分:0)

无需运行两个查询。 MongoDB允许通过投影进行文档转换。

使用$elemMatch运算符查找+投影。 (包括/排除)

db.collection.find({},
{
  productId: 1,
  productName: 1,
  ProductItems: {
    $elemMatch: {
      "Code": "TP1A"
    }
  }
})

使用$filter运算符进行汇总(高级功能)

db.collection.aggregate([
  {
    $addFields: {
      ProductItems: {
        $filter: {
          input: "$ProductItems",
          cond: {
            $eq: [
              "$$this.Code",
              "TP1A"
            ]
          }
        }
      }
    }
  }
])