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

Temukan elemen berdasarkan dua nilai

Dari penipuan yang ditautkan sebelumnya (mungkin) , solusi menggunakan $where akan mengikuti:

db.collection.find({
    "$where": function() {
        self = this;
        return this.actors.filter(function(actor) {
            return self.director._id === actor._id;
        }).length > 0
    }
})

Dan pendekatan lain yang disarankan yang menggunakan kerangka kerja agregasi $redact saluran:

db.collection.aggregate([
    { 
        "$redact": { 
            "$cond": [
                { 
                    "$setIsSubset": [ 
                        ["$director._id"], 
                        {
                            "$map": {
                                "input": "$actors",
                                "as": "el",
                                "in": "$$el._id"
                            }
                        }
                    ] 
                },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    }
])

Di atas, logika kondisi untuk $redact dilakukan melalui penggunaan set operator $setIsSubset dan $map .

$map operator akan mengembalikan array hanya dengan id aktor dari actors array setelah menerapkan ekspresi ke setiap elemen dalam array. Jadi misalnya, ekspresi

{
    "$map": {
        "input": "$actors",
        "as": "el",
        "in": "$$el._id"
    }
}

jika diterapkan pada array aktor

[ 
    {
        "_id" : "artist:3",
        "first_name" : "James",
        "last_name" : "Stewart",
        "birth_date" : "1908",
        "role" : "John Ferguson"
    }, 
    {
        "_id" : "artist:16",
        "first_name" : "Kim",
        "last_name" : "Novak",
        "birth_date" : "1925",
        "role" : "Madeleine Elster"
    }, 
    {
        "_id" : "artist:282",
        "first_name" : "Arthur",
        "last_name" : "Pierre",
        "birth_date" : null,
        "role" : null
    }
]

akan kembali

[ "artist:3", "artist:16", "artist:282" ]

Hasil ini dibandingkan dengan larik elemen tunggal ["$directors._id"] menggunakan $setIsSubset operator yang mengambil dua larik dan mengembalikan true ketika larik pertama adalah subset dari larik kedua, termasuk ketika larik pertama sama dengan larik kedua, dan false jika sebaliknya.

Misalnya,

{ 
    "$setIsSubset": [ 
        [ "artist:12" ], 
        [ "artist:3", "artist:16", "artist:282" ] 
    ] 
}       // false

{ 
    $setIsSubset: [ 
        [ "artist:282" ], 
        [ "artist:3", "artist:16", "artist:282" ] 
    ] 
}       // true

Hasil boolean dari operator kemudian digunakan sebagai dasar untuk $redact saluran pipa.

Penjelasan untuk kinerja masih berlaku:$where adalah peretasan yang bagus bila perlu, tetapi harus dihindari bila memungkinkan.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Pendefinisian skema Mongodb

  2. Apa sintaks untuk Tanggal di MongoDB yang berjalan di MongoLab?

  3. Tidak dapat memperbarui objek Inner Arraylist menggunakan Driver Java Mongodb

  4. Perbarui array multi-sarang di Mongodb

  5. Bagaimana cara mengatur useMongoClient (Mongoose 4.11.0)?