MongoDB Python MongoEngine - 通过嵌入式文档的过滤器返回文档 过滤属性的总和。

问题描述 投票:0回答:1

我正在使用Python和MongoEngine尝试在MongoDB中查询以下文档。

我需要一个查询来有效地获取文档,只有当它们包含符合以下条件的嵌入式文档'关键词'时,才可以查询。

  • Keywords Filtered where the Property 'SFR' is LTE '100000'(关键字过滤)。
  • 对过滤后的关键词进行SUM
  • 返回符合标准的关键词的SUM大于'9'的父文档。

示例结构。

{ 
    "_id" : ObjectId("5eae60e4055ef0e717f06a50"), 
    "registered_data" : ISODate("2020-05-03T16:12:51.999+0000"), 
    "UniqueName" : "SomeUniqueNameHere", 
    "keywords" : [
        {
            "keyword" : "carport", 
            "search_volume" : NumberInt(10532), 
            "sfr" : NumberInt(20127), 
            "percent_contribution" : 6.47, 
            "competing_product_count" : NumberInt(997), 
            "avg_review_count" : NumberInt(143), 
            "avg_review_score" : 4.05, 
            "avg_price" : 331.77, 
            "exact_ppc_bid" : 3.44, 
            "broad_ppc_bid" : 2.98, 
            "exact_hsa_bid" : 8.33, 
            "broad_hsa_bid" : 9.29
        }, 
        {
            "keyword" : "party tent", 
            "search_volume" : NumberInt(6944), 
            "sfr" : NumberInt(35970), 
            "percent_contribution" : 4.27, 
            "competing_product_count" : NumberInt(2000), 
            "avg_review_count" : NumberInt(216), 
            "avg_review_score" : 3.72, 
            "avg_price" : 210.16, 
            "exact_ppc_bid" : 1.13, 
            "broad_ppc_bid" : 0.55, 
            "exact_hsa_bid" : 9.66, 
            "broad_hsa_bid" : 8.29
        }
    ]
}

从我所做的研究来看,我相信一个聚合类型的查询可能会达到我所尝试的效果。

不幸的是,作为MongoDB MongoEngine的新手,我正在努力寻找如何构建查询的结构,并且没有找到与我试图做的事情类似的例子(RED FLAG RIGHT???)。

我确实找到了一个集合的例子,但不确定如何在其中构建我的标准,也许像这样的东西越来越接近,但不工作。

pipeline = [
    { 
        "$lte": {
            "$sum" : {
                "keywords" : {
                    "$lte": {
                        "keyword": 100000
                    }
                }
            }: 9
        }
    }
]
data = product.objects().aggregate(pipeline)

任何指导将是非常感激的。

谢谢你,Ben

python mongodb mongoengine
1个回答
0
投票

你可以尝试像这样

db.collection.aggregate([
  {
    $project: { // the first project to filter the keywords array
      registered_data: 1,
      UniqueName: 1,
      keywords: {
        $filter: {
          input: "$keywords",
          as: "item",
          cond: {
            $lte: [
              "$$item.sfr",
              100000
            ]
          }
        }
      }
    }
  },
  {
    $project: { // the second project to get the length of the keywords array
      registered_data: 1,
      UniqueName: 1,
      keywords: 1,
      keywordsLength: {
        $size: "$keywords"
      }
    }
  },
  {
    $match: { // then do the match
      keywordsLength: {
        $gte: 9
      }
    }
  }
])

你可以在这里测试 艋舺游乐场

希望对你有帮助

注意,我用的是 sfr 为了简单起见,只从关键字数组中提取属性。

© www.soinside.com 2019 - 2024. All rights reserved.