查询后聚合组在对象数组上不同

时间:2018-01-25 08:42:59

标签: mongodb aggregation-framework

我有一系列产品,产品如下所示:

In [2]: requests.get('http://www.dwconstir.com/inc/download.asp?FileName=3Q17%20%uC2E4%uC801PT_ENG.pdf')
Out[2]: <Response [400]>

我想要的是让所有拥有{ "invNumber":445, "attributes": [ { "id": "GR1", "value": "4", "description": "Re/Rek" }, { "id": "WEBAKKUNDE", "value": "2", "description": "NO" }, { "id": "WEBAKKUNDK", "value": "1", "description": "YES" }, { "id": "WEBAKMONTO", "value": "2", "description": "NO" } { "id": "WEBPAKFTTH", "value": "2", "description": "NO" } ] } {"id":"WEBAKKUNDE",value:1}并且来自这些产品的产品,而不仅仅是返回所有产品 {"id":"WEBPAKFTTH","value":"1"}个对象。

我想尝试这样的事情:

{"id": "GR1"}

但我不知道如何从退回的产品中获取不同的对象。

2 个答案:

答案 0 :(得分:0)

尝试以下查询:

$match:{ "attributes.id" : "WEBAKKUNDE", "attributes.value":"1" }

但我们来解释一下:

id会找到与文档中的value$unwind: "$attributes"属性相匹配的所有文档:

$match: { "attributes.id": "GR1" }将为我们提供数组项目的文档,因此在您的示例中,我们最终会得到5个文档。

id会过滤掉GR1 use Symfony\Component\HttpFoundation\Session\Flash\FlashBag; use Symfony\Component\HttpFoundation\Session\Session; use Symfony\Component\Translation\Translator; class FlashBagTranslator { /** @var Translator $translator */ private $translator; /** @var FlashBag $flashBag */ private $flashBag; public function __construct(Translator $translator, Session $session) { $this->translator = $translator; $this->flashBag = $session->getFlashBag(); } public function addMessage($type, $translationKey, array $parameters = [], $domain = null, $locale = null) { $message = $this->translator->trans($translationKey, $parameters, $domain, $locale); if ($message === $translationKey) { // Your translation isn't findable, do something :) return false; } $this->flashBag->add($type, $message); return true; } }

的剩余时间

更多阅读:

https://docs.mongodb.com/manual/reference/operator/aggregation/match https://docs.mongodb.com/manual/reference/operator/aggregation/unwind

答案 1 :(得分:0)

您可以使用以下聚合查询。

$match检查数组是否有输入条件,后跟$filter $arrayElemAt以投影GR1元素。

GR1元素上的

$group输出不同的值。

注意 - 如果您希望拥有没有GR1元素的属性来匹配属性,则需要将GR1条件添加到$ match。

db.products.aggregate([
  {"$match":{
    "attributes":{
      "$elemMatch":{
        "$or":[
          {"id":"WEBAKKUNDE","value":"1"},
          {"id":"WEBPAKFTTH","value":"1"}
        ]
      }
    }
  }},
  {"$group":{
    "_id":{
      "$arrayElemAt":[
        {"$filter":{"input":"$attributes","cond":{"$eq":["$$this.id","GR1"]}}},
        0
      ]
    }
  }}
])