MongoDB Python MongoEngine - Возврат документа по фильтру встроенных документов Сумма отфильтрованного свойства - PullRequest
0 голосов
/ 05 мая 2020

Я использую Python и MongoEngine, чтобы попытаться запросить приведенный ниже документ в MongoDB.

Мне нужен запрос для эффективного получения документов, только если они содержат «Ключевые слова» встроенных документов, которые соответствуют следующим критериям :

  • Отфильтрованные ключевые слова, где свойство SFR - LTE '100000'
  • СУММ отфильтрованных ключевых слов
  • Возвращает родительские документы, где СУММ ключевых слов соответствует критерий больше, чем '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, я изо всех сил пытаюсь понять, как структурировать запрос, и не смог найти пример, похожий на то, что я пытаюсь сделать (КРАСНЫЙ ФЛАГ ВПРАВО? ???).

Я нашел пример агрегата, но не уверен, как структурировать в нем свои критерии, может быть, что-то вроде этого приближается, но не работа.

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

Любое руководство будет очень признательно.

Спасибо, Бен

1 Ответ

0 голосов
/ 06 мая 2020

вы можете попробовать что-то вроде этого

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
      }
    }
  }
])

вы можете проверить это здесь Пн go Детская площадка

надеюсь, что это поможет

Обратите внимание, для простоты я использовал свойство sfr только из массива ключевых слов

...