mongodb, где не существует (вычесть два результата запроса) - PullRequest
0 голосов
/ 16 ноября 2018

считают, что у меня есть следующая коллекция,

[

    {
        "user_id": 7,
        "action": 1
    },
    {
        "user_id": 8,
        "action": 1
    },
    {
        "user_id": 9,
        "action": 1
    },
    {
        "user_id": 7,
        "action": 2
    }

]

Мне нужно найти всех пользователей, у которых есть, например, действие 1, но нет действия 2. В mysql можно просто выбрать user_id с двумя запросами и вычесть эти результаты или использовать подзапрос, где не существует.

как мне справиться с этим с mongodb?

поэтому мой ожидаемый результат:

[8,9]

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Вы можете использовать $group и $push actions для различных user_id. Наконец, используйте $match с actions $eq к 1, но не равно ($ne) к 2

db.collection.aggregate([
  { "$group": {
    "_id": "$user_id",
    "actions": { "$push": "$action" }
  }},
  { "$match": { "actions": { "$eq": 1, "$ne": 2 }}},
  { "$project": { "_id": 1 }
])
0 голосов
/ 16 ноября 2018

Вы можете использовать конвейер агрегации, чтобы сначала сгруппировать все действия в один массив плюс связанный идентификатор пользователя в объекты и фильтр для действия 1, но не 2, затем сохранить только идентификатор:

db.collection.aggregate([
  // group user id and all actions together
  {
    $group: {
      _id: "$user_id",
      actions: {
        $addToSet: "$action"
      }
    }
  },
  // filter documents which have 1 as action but not 2
  {
    $match: {
      $and: [
        {
          "actions": 1
        },
        {
          "actions": {
            $not: {
              $eq: 2
            }
          }
        }
      ]
    }
  },
  // only keep the id
  {
    $group: {
      _id: "$_id"
    }
  }
])

Возвращает:

[
  {
    "_id": 8
  },
  {
    "_id": 9
  }
]

Вот ссылка на playgorund: https://mongoplayground.net/p/So4HjEXx3sn

Вы должны рассмотреть, как вы структурируете свои документы. Ваш дизайн немного похож на реляционную базу данных. Желательно смоделировать ваши документы в соответствии с вашими правами на чтение (если это возможно). В этом случае вы можете указать поля user_id и actions, в которых уже сгруппированы все идентификаторы действий.

...