MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Извикване на функция db.system.js в $where

Свързвате ли се със същото пространство от имена на база данни във вашия 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.

Но вашата основна грешка тук ще бъде, защото функцията е била в различно пространство от имена или наистина сте рестартирали сървъра между тях. Но общата точка е, че вероятно не трябва да използвате съхранени функции така или иначе.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mongoose сумира стойност във всички документи

  2. MongoDB - групов съставен ключ с вложени полета

  3. когато премахнете документ от ограничена колекция в mongoDB, то чрез грешка?

  4. Четене на масив в mongodb?

  5. REST AJAX заявка към mongoDB