Saya memiliki skema berikut:

  User Schema: 
   { userId:"Id1",name:"abc"}, { userId:"Id2",name:"efg"}, { userId:"Id3",name:"lmn"}, { userId:"Id4",name:"xyz"}

  Image Schema:
   { userId:"Id1",imageUrl:"url1",isFlaged:true},{ userId:"Id1",imageUrl:"url2",isFlaged:false},{ userId:"Id1",imageUrl:"url3",isFlaged:false},
   { userId:"Id2",imageUrl:"url4",isFlaged:true},{ userId:"Id2",imageUrl:"url5",isFlaged:false},
   { userId:"Id3",imageUrl:"url6",isFlaged:false},{ userId:"Id3",imageUrl:"url7",isFlaged:false},
   { userId:"Id4",imageUrl:"url8",isFlaged:false},{ userId:"Id4",imageUrl:"url9",isFlaged:false},

Saya ingin mendapatkan semua ID pengguna yang tidak memiliki gambar yang ditandai, yaitu, isFlaged 'salah' untuk semua gambarnya (dengan kata lain, pengguna tidak memiliki gambar yang isFlaged disetel benar)

Seperti hasil untuk data di atas harus mengembalikan users with userIds Id3 and Id4 karena semua gambarnya memiliki isFlaged sebagai salah, dan tidak ada yang benar

Saya telah mencoba pendekatan di bawah ini

db.users.aggregate([
        {
          $lookup: {
            from: 'images',
            let: {userID: '$userId'},
            pipeline: [
              {
                $match: {
                  $expr: {
                    $and: [{$eq: ['$userId','$$userID']},
                    // tried this too {$ne: ['$isFlaged',false]}],
                  },
                },
              },
              {
                $project: {
                  _id: 0,
                  imageUrl: 1,
                  isFlaged:1,
                }
              },
            ],
            as: 'image',
          },
        },
        {
            $match:{
              '$image.isFlaged':{
                 $nin:[true]  // or using {$not:{$all:[false]}}
               } 
            }
        },
        {
          $limit: 10
        },
        {
          $project: {
            userId: 1,
            image: '$image'
          },
        }
      ]);

Saya tidak baik dengan agregasi. Saya baru saja mencoba bereksperimen dengan kueri, namun sepertinya tidak ada yang berhasil. Jadi adakah yang bisa tolong beri tahu saya bagaimana Anda melakukan ini? Atau tautan apa pun yang berguna akan sangat membantu juga. Saya tidak yakin kueri atau metode apa yang digunakan, karena saya tidak tahu banyak tentang monogodb.

0
user13116294 12 Mei 2021, 11:53

1 menjawab

Jawaban Terbaik

Anda hanya perlu memperbaiki kondisi panggung $match

  • "image.isFlaged" tidak boleh benar dan image tidak sama dengan kosong
db.users.aggregate([
  {
    $lookup: {
      from: "images",
      let: { userId: "$userId" },
      pipeline: [
        {
          $match: {
            $expr: { $eq: ["$$userId", "$userId"] } }
          }
        },
        { $project: { _id: 0, imageUrl: 1, isFlaged: 1 } }
      ],
      as: "image"
    }
  },
  { $match: { image: { $ne: [] }, "image.isFlaged": { $ne: true } } },
  { $limit: 10 },
  {
    $project: {
      userId: 1,
      image: 1
    }
  }
])

Tempat bermain

3
turivishal 12 Mei 2021, 10:51