Saya memiliki saluran agregasi dan dokumen saya saat ini dalam format berikut:

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

Di mana userGroupIds adalah hasil dari tahap sebelumnya, di mana saya menemukan ID grup tempat pengguna berada.

Saya mencoba menambahkan tahap pencocokan ke saluran untuk menemukan semua dokumen yang memiliki ID pengguna yang cocok dengan ID tertentu, ATAU memiliki properti sharedWithGroups yang berisi salah satu entri di userGroupIds.

Saya pikir sesuatu seperti ini akan berhasil:

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

Tapi saya mendapatkan kesalahan: $in needs an array. Saya tidak mengerti karena $userGroupIds jelas merupakan sebuah array. Saya sudah mencoba menggunakan $expr, berpikir bahwa nilai bidang mungkin tidak dapat diselesaikan, tetapi tidak berhasil. Apakah pendekatan ini mungkin, atau adakah cara lain/lebih baik untuk memfilter dokumen-dokumen ini menggunakan banyak kriteria?

1
Craig 5 Maret 2020, 00:03

1 menjawab

Jawaban Terbaik

Anda dapat mencoba ini:

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

Uji : MongoDB-Playground

(Atau)

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

Uji : MongoDB-Playground

2
whoami - fakeFaceTrueSoul 4 Maret 2020, 21:14