MongoDB Aggregation: использовать значение поля текущего документа в $ match $ или запросе - PullRequest
1 голос
/ 05 марта 2020

У меня есть конвейер агрегации, и мои документы в настоящее время имеют следующий формат:

{
    "user": "5e3d326537df7e4dda73eb23",
    "sharedWithGroups": [ "5e3d326437df7e4dda73eb13", "5e3d326437df7e4dda73eb19" ],
    "userGroupIds": [ "5e3d326437df7e4dda73eb19" ]
}

Где userGroupIds - результат предыдущего этапа, где я нахожу идентификаторы групп, которые пользователь находится в.

Я пытаюсь добавить этап сопоставления в конвейер, чтобы найти все документы, которые имеют либо идентификатор пользователя, который совпадает с указанным c идентификатором, либо ИЛИ свойство sharedWithGroups, которое содержит один из записей в userGroupIds.

Я думал, что что-то вроде этого будет работать:

{
  $match: {
    $or: [
      { user: "5e3d326537df7e4dda73eb23" },
      { sharedWithGroups: { $in: "$userGroupIds" } }
    ]
  }
}

Но я получаю ошибку: $in needs an array. Я не понимаю, потому что $userGroupIds определенно массив. Я пытался использовать $ expr, думая, что значение поля, возможно, не разрешается, но не повезло. Возможен ли такой подход или есть другой / лучший способ фильтрации этих документов по нескольким критериям?

1 Ответ

2 голосов
/ 05 марта 2020

Вы можете попробовать это:

{
    $match: {
        $or: [
            { user: "5e3d326537df7e4dda73eb23" },
            { $expr: { $gt: [{ $size: { $setIntersection: ["$sharedWithGroups", "$userGroupIds"] } }, 0] } }
        ]
    }
}

Тест: MongoDB-Playground

(Или)

{
    $match: {
        $or: [
            { user: "5e3d326537df7e4dda73eb23" },
            { $expr: { $setIsSubset: ["$userGroupIds", "$sharedWithGroups"] } }
        ]
    }
}

Тест: MongoDB-Playground

...