mongodb использует $ count в агрегации - PullRequest
1 голос
/ 19 марта 2019

У меня есть коллекция автомобилей, где одно из полей является массивом, скажем, что-то вроде:

"designers": [
    "John Smith",
    "Jane Smith",
]

и у меня есть множество дизайнеров, скажем, что-то вроде:

"topDesigners": [
    "Brad Johnson",
    "Kevin Williams",
    "John Smith"
]

и я хочу посчитать, сколько в первую очередь дизайнеров.

Например:

"designers": [
    "Kevin Williams",
    "Jane Smith",
]

результат желания: count = 1

 "designers": [
    "Jane Smith",
    "John Smith"
]

результат желания: count = 1

 "designers": [
    "Kevin Huntzberger",
    "Brad Johnson",
    "John Smith"
]   

результат желания: count = 2

1 Ответ

1 голос
/ 19 марта 2019

setIntersection - способ достижения этого.

Принимая этот документ:

    {
    designers: [
      "John Smith",
      "Jane Smith"
    ],
    topDesigners: [
      "Brad Johnson",
      "Kevin Williams",
      "John Smith"
      ]
  }

Вы можете применить следующий агрегированный запрос для извлечения элементов, которые находятся как в конструкторах, так и в массивах topDesigners. И $ size, чтобы получить размер этого нового массива:

db.collection.aggregate([
  {
    $project: {
      designers: "$designers",
      topDesigners: "$topDesigners",
      areInBoth: {
        $setIntersection: [
          "$designers",
          "$topDesigners"
        ]
      },
      areInBothSize: {
        $size: {
          $setIntersection: [
            "$designers",
            "$topDesigners"
          ]
        }
      }
    }
  }
])

Результатом будет:

[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "areInBoth": [
      "John Smith"
    ],
    "areInBothSize": 1,
    "designers": [
      "John Smith",
      "Jane Smith"
    ],
    "topDesigners": [
      "Brad Johnson",
      "Kevin Williams",
      "John Smith"
    ]
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...