Свързвате ли се със същото пространство от имена на база данни във вашия PHP код, към което сте се свързали с помощта на обвивката? Мисля, че не!
Както и да е, вие не разбирате концепцията на $where
в този контекст, тъй като можете само да оценявате и ненавръщане модифицирани резултати, различни от данните, които вече се съдържат в колекцията.
Единствените неща, които действително могат да върнат нещо различно от съществуващите документи, са .mapReduce()
и .aggregate()
.
Така че, за да демонстрирам, в „същото пространство от имена“, ако дефинирате колекция:
db.djunk.insert({ "x": 1, "y": 2 })
И след това стартирайте .mapReduce()
db.dbjunk.mapReduce(
function() {
emit(this._id, sum(this.x,this.y))
},
function() {}, // does nothing here where already unique
{ "out": { "inline": 1 } }
)
Това ще върне действителен сумиран резултат:
{
"_id" : ObjectId("571a9bb951d042a7a896fd92"),
"value" : 3
}
Всичко това $where
можете да направите, е "логично" да изберете документа:
db.djunk.find(function() {
return sum(this.x,this.y) > 3
})
Което не отговаря на условието.
Но, разбира се, наистина не е нужно да правите това и като цяло трябва да избягвате каквото и да е сървърно изпълнение на JavaScript, където е възможно. Той е много по-бавен от естествените оператори и можете да направите доста с естествените оператори.
Така че вместо .mapReduce()
извикване на .aggregate()
:
db.djunk.aggregate([
{ "$project": {
"total": { "$add": [ "$x", "$y" ] }
}}
])
И вместо оценка на JavaScript, извикайте .aggregate()
отново с $redact
за "логическо" филтриране:
db.djunk.aggregate([
{ "$redact": {
"$cond": {
"if": { "$gt": [ { "$add": [ "$x", "$y" ] }, 3 ] },
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
Така че в повечето случаи винаги има по-добра алтернатива на използването на JavaScript оценка. И със сигурност има много малко случаи, когато наистина се нуждаете от съхранени в сървъра функции в случаите, когато действително се изисква оценка на JavaScript.
Но вашата основна грешка тук ще бъде, защото функцията е била в различно пространство от имена или наистина сте рестартирали сървъра между тях. Но общата точка е, че вероятно не трябва да използвате съхранени функции така или иначе.