MongoDB найти, где у пользователя есть оба - PullRequest
1 голос
/ 11 марта 2019

Я действительно не знаю, как сформулировать тему этого вопроса.Вот что я пытаюсь сделать.

У меня есть документы, которые выглядят так:

У пользователя 1 есть один документ:

{
"_id" : ObjectId("5c8362762ee0d534e38fa7b1"),
"Reason" : "Reason 1",
"PUID" : "PUID11111",
"Activity" : "login",
}

У пользователя 1 есть другой документ:

{
"_id" : ObjectId("5c8362762ee0d534e38fa7c4"),
"Reason" : "Reason 2",
"PUID" : "PUID11111",
"Activity" : "login",
}

PUID является идентификатором пользователя, а Reason может быть несколькими известными значениями.

Поисковый запрос, который я пытаюсь создать, -> Я ищу все PUID, в которых есть Reason элемент "Reason 1" и "Reason 2".Если PUID имеет только элемент Reason "Reason 1" или только "Reason 2", то это не соответствует.Я пытаюсь найти пользователей с обоими Причины.

Любая помощь будет оценена.Я пробовал $ where и разные поиски, но, похоже, ничего не дает мне результата.

1 Ответ

2 голосов
/ 11 марта 2019

Я думаю, что это решит вашу проблему. Идея состоит в том, чтобы использовать конвейер агрегации (извините за вкладки):

db.collection.aggregate([{
  $group: {
    _id: "$PUID",
    reasons: {
      $addToSet: "$Reason"
    }
  }
},
{
  $match: {
    reasons: {
      $all: ["Reason1", "Reason2"]
    }
  }
}])

На групповом этапе мы группируем документы по полю PUID и создаем набор причин (чтобы избежать дублирования). На этапе сопоставления мы просто фильтруем документы, которые содержат обе причины одновременно.

Редактировать : переключено на $ all вместо $ in, спасибо JohnnyHK

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...