sql >> データベース >  >> NoSQL >> MongoDB

$whereでdb.system.js関数を呼び出す

    シェルを使用して接続したのと同じ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. 作成したドキュメントのみを管理できるMongoDBユーザーを作成します

    2. 'メッセージ'リスナーでRedisを削除する方法

    3. HerokuのRedistogoとSidekiq:接続できません

    4. Flaskユーザー認証