MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Luwak:cara menggunakan agregat dan menemukan bersama

Untuk MongoDB 3.6 dan yang lebih baru, gunakan $expr operator yang memungkinkan penggunaan ekspresi agregasi dalam bahasa kueri:

var followers_count = 30;
db.locations.find({
   "$expr": { 
       "$and": [
           { "$eq": ["$name", "development"] },
           { "$gte": [{ "$size": "$followers" }, followers_count ]}
       ]
    }
});

Untuk versi yang tidak kompatibel, Anda dapat menggunakan $match dan $redact pipeline untuk menanyakan koleksi Anda. Misalnya, jika Anda ingin menanyakan locations koleksi dengan nama 'pengembangan' dan followers_count lebih besar dari 30, jalankan operasi agregat berikut:

const followers_count = 30;
Locations.aggregate([
    { "$match": { "name": "development" } },
    {
        "$redact": {
            "$cond": [
                { "$gte": [ { "$size": "$followers" }, followers_count ] },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    }
]).exec((err, locations) => {
    if (err) throw err;
    console.log(locations);
})

atau dalam satu saluran sebagai

Locations.aggregate([
    {
        "$redact": {
            "$cond": [
                { 
                    "$and": [
                        { "$eq": ["$name", "development"] },
                        { "$gte": [ { "$size": "$followers" }, followers_count ] }
                     ]
                },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    }
]).exec((err, locations) => {
    if (err) throw err;
    console.log(locations);
})

Di atas akan mengembalikan lokasi hanya dengan _id referensi dari pengguna. Untuk mengembalikan dokumen pengguna sebagai sarana untuk "mengisi" larik pengikut, Anda dapat menambahkan $lookup pipa.

Jika versi server Mongo yang mendasarinya adalah 3.4 dan yang lebih baru, Anda dapat menjalankan pipeline sebagai

let followers_count = 30;
Locations.aggregate([
    { "$match": { "name": "development" } },
    {
        "$redact": {
            "$cond": [
                { "$gte": [ { "$size": "$followers" }, followers_count ] },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    },
    {
        "$lookup": {
            "from": "users",
            "localField": "followers",
            "foreignField": "_id",
            "as": "followers"
        }
    }
]).exec((err, locations) => {
    if (err) throw err;
    console.log(locations);
})

jika tidak, Anda perlu $unwind array pengikut sebelum menerapkan $lookup lalu kelompokkan kembali dengan $group pipa setelah itu:

let followers_count = 30;
Locations.aggregate([
    { "$match": { "name": "development" } },
    {
        "$redact": {
            "$cond": [
                { "$gte": [ { "$size": "$followers" }, followers_count ] },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    },
    { "$unwind": "$followers" },
    {
        "$lookup": {
            "from": "users",
            "localField": "followers",
            "foreignField": "_id",
            "as": "follower"
        }
    },
    { "$unwind": "$follower" },
    {
        "$group": {
            "_id": "$_id",
            "created": { "$first": "$created" },
            "name": { "$first": "$name" },
            "followers": { "$push": "$follower" }
        }
    }
]).exec((err, locations) => {
    if (err) throw err;
    console.log(locations);
})


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Menangani ISODate() MongoDB saat mencoba mengurai string JSON serial

  2. berbagi koneksi db di seluruh aplikasi di luwak

  3. Nilai waktu tanggal MongoDB tidak disimpan dengan benar

  4. MongoDb dengan FastAPI

  5. Apakah indeks MongoDB persisten di seluruh restart?