Saya memiliki kueri luwak di mana saya membatasi jumlah hasil katakanlah 3 entri. Masalah saya adalah, bahwa setiap objek diisi dengan objek bersarang. Objek bersarang ini memiliki flag "aktif". Saya tidak ingin mengembalikan objek apa pun yang memiliki objek bersarang di mana tanda "aktif" salah, tetapi filter populasi diterapkan setelah batas dan oleh karena itu hasilnya bisa kosong.

Apakah mungkin melakukan sesuatu seperti ini tanpa menjalankan kueri sekali lagi dengan offset lain hingga batas tercapai?

Contoh:

Activity.find(query)
        .skip(offset)
        .limit(limit)
        .sort({timestamp: -1})
        .populate('source')
        .exec()

Offset dan batas adalah untuk fungsionalitas pengguliran tanpa akhir.

Yang saya coba adalah ini:

Activity.find(query)
        .skip(offset)
        .populate('source').
        .where('source.active').equals(true)
        .limit(limit)
        .sort({timestamp: -1})
        .exec()
1
Tobias Stangl 15 Maret 2017, 11:04

2 jawaban

Jawaban Terbaik

Solusi untuk masalah tersebut adalah dengan menggunakan kerangka kerja agregasi luwak (https://docs.mongodb.com /manual/agregasi/).

Setelah itu, kodenya terlihat sebagai berikut (disederhanakan):

Activity.
  .aggregate([
    {
      $lookup: {
        from: 'users',
        localField: 'source',
        foreignField: '_id',
        as: 'user_docs'
      }
    },
    {
      $match: {
        user_docs: {
          $elemMatch: {
            active: true
          }
        }
    },
    {$limit: options.limit},
    {$sort: {timestamp: -1}}
    ]);

Populasi tambahan dapat dilakukan setelahnya melalui Model.populate(results, path).

0
Tobias Stangl 11 September 2017, 05:32

Anda dapat mengisi beberapa dokumen tertentu: Anda dapat mengisi banyak dokumen dengan menentukan path, match di mana Anda dapat memilih yang aktif dan Anda juga dapat menggunakan options:

Activity
  .find(query)
  .skip(offset)
  .populate({
    path: 'source',
    match: {
      active: true
    }
  })
  .limit(limit)
  .sort({
    timestamp: -1
  })
  .exec()

Untuk lebih lanjut, periksa dokumentasi http://mongoosejs.com/docs/populate.html

0
Yosvel Quintero Arguelles 21 Maret 2017, 07:56