Apakah Anda terhubung ke namespace database yang sama dalam kode PHP yang Anda hubungkan menggunakan shell? Saya rasa tidak!
Bagaimanapun Anda salah memahami konsep $where
dalam konteks ini, karena Anda hanya dapat mengevaluasi dan tidak kembali hasil yang dimodifikasi selain data yang sudah ada dalam koleksi.
Satu-satunya hal yang benar-benar dapat mengembalikan sesuatu yang berbeda dari dokumen yang ada adalah .mapReduce()
dan .aggregate()
.
Jadi untuk mendemonstrasikan, di "ruang nama yang sama" jika Anda mendefinisikan koleksi:
db.djunk.insert({ "x": 1, "y": 2 })
Dan kemudian jalankan .mapReduce()
db.dbjunk.mapReduce(
function() {
emit(this._id, sum(this.x,this.y))
},
function() {}, // does nothing here where already unique
{ "out": { "inline": 1 } }
)
Itu akan mengembalikan hasil penjumlahan yang sebenarnya:
{
"_id" : ObjectId("571a9bb951d042a7a896fd92"),
"value" : 3
}
Semua itu $where
dapat dilakukan, adalah "logis" pilih dokumen:
db.djunk.find(function() {
return sum(this.x,this.y) > 3
})
Yang tidak akan memenuhi syarat.
Tapi tentu saja Anda benar-benar tidak perlu melakukan ini, dan umumnya harus menghindari eksekusi server JavaScript jika memungkinkan. Ini jauh lebih lambat daripada operator asli, dan Anda dapat melakukan sedikit dengan operator asli.
Jadi alih-alih .mapReduce()
panggil .aggregate()
:
db.djunk.aggregate([
{ "$project": {
"total": { "$add": [ "$x", "$y" ] }
}}
])
Dan alih-alih evaluasi JavaScript, panggil .aggregate()
lagi, dengan $redact
untuk pemfilteran "logis":
db.djunk.aggregate([
{ "$redact": {
"$cond": {
"if": { "$gt": [ { "$add": [ "$x", "$y" ] }, 3 ] },
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
Jadi dalam banyak kasus selalu ada alternatif yang lebih baik untuk menggunakan evaluasi JavaScript. Dan tentu saja ada sangat sedikit kasus yang benar-benar membutuhkan fungsi yang disimpan server dalam kasus di mana evaluasi JavaScript sebenarnya diperlukan.
Tetapi kesalahan dasar Anda di sini adalah karena fungsinya berada di namespace yang berbeda, atau memang Anda me-restart server di antaranya. Tapi intinya adalah Anda mungkin tidak boleh menggunakan fungsi yang tersimpan.