Bạn có đang kết nối với cùng một không gian tên cơ sở dữ liệu trong mã PHP mà bạn đã kết nối bằng cách sử dụng shell không? Tôi nghĩ là không!
Dù sao thì bạn cũng hiểu sai khái niệm về $where
trong ngữ cảnh này, vì bạn chỉ có thể đánh giá và không quay lại kết quả đã sửa đổi khác với dữ liệu đã có trong bộ sưu tập.
Những thứ duy nhất thực sự có thể trả lại thứ gì đó khác với các tài liệu hiện có là .mapReduce()
và .aggregate()
.
Vì vậy, để chứng minh, trong "cùng một không gian tên" nếu bạn xác định một tập hợp:
db.djunk.insert({ "x": 1, "y": 2 })
Và sau đó chạy .mapReduce()
db.dbjunk.mapReduce(
function() {
emit(this._id, sum(this.x,this.y))
},
function() {}, // does nothing here where already unique
{ "out": { "inline": 1 } }
)
Điều đó sẽ trở lại một kết quả tổng hợp thực tế:
{
"_id" : ObjectId("571a9bb951d042a7a896fd92"),
"value" : 3
}
Tất cả $where
có thể làm, là chọn tài liệu "một cách hợp lý":
db.djunk.find(function() {
return sum(this.x,this.y) > 3
})
Cái nào sẽ không đáp ứng điều kiện.
Nhưng tất nhiên bạn thực sự không cần phải làm điều này và nói chung nên tránh bất kỳ máy chủ nào thực thi JavaScript nếu có thể. Nó chậm hơn nhiều so với các toán tử gốc và bạn có thể thực hiện được một chút với các toán tử gốc.
Vì vậy, thay vì .mapReduce()
gọi .aggregate()
:
db.djunk.aggregate([
{ "$project": {
"total": { "$add": [ "$x", "$y" ] }
}}
])
Và thay vì đánh giá JavaScript, hãy gọi .aggregate()
một lần nữa, với $redact
để lọc "logic":
db.djunk.aggregate([
{ "$redact": {
"$cond": {
"if": { "$gt": [ { "$add": [ "$x", "$y" ] }, 3 ] },
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
Vì vậy, trong hầu hết các trường hợp, luôn có một giải pháp thay thế tốt hơn là sử dụng đánh giá JavaScript. Và chắc chắn có rất ít trường hợp thực sự cần đến các chức năng được lưu trữ trên máy chủ trong trường hợp thực sự cần đến đánh giá JavaScript.
Nhưng lỗi cơ bản của bạn ở đây là do hàm nằm trong một không gian tên khác hoặc thực sự là bạn đã khởi động lại máy chủ ở giữa. Nhưng điểm chung là bạn có thể không nên sử dụng các hàm được lưu trữ.