Mongdb内のストアド関数を呼び出すのにいくつかの問題が発生しています。私はmongoの初心者です。
[編集]:mongodbに保存されている私の関数
function() {
var cndTime = new Date().getTime() - (3600*1000*24*2); // condition
db.urls.find(needParse: false).forEach(function(item){
if(item.date < cndTime) // check
db.urls.update({_id: item._id}, {$set: { needParse: true }}); // update field
});
}
私が求めているのは、reactivemongoまたはネイティブAPIを使用してこの関数を呼び出す方法だけです。
最初にechoFunction
という名前の関数を_system.js
_コレクションに保存し、db.eval()
を使用して関数を呼び出すmongoシェルの次の例について考えてみます。
_db.system.js.save({
_id: "echoFunction",
value: function (x) {
return 'echo: ' + x;
}
})
db.eval("echoFunction('test')") // -> "echo: test"
_
echoFunction(...)
はeval
/_$where
_/mapReduce
などで利用できます。詳細については http://docs.mongodb.org/)を参照してください。 manual/tutorial/store-javascript-function-on-server
Mongoシェルでは、db.loadServerScripts()を使用して、現在のデータベースのsystem.jsコレクションに保存されているすべてのスクリプトをロードできます。ロードされると、次の例のように、シェルで直接関数を呼び出すことができます
db.loadServerScripts();
mySampleFunction(3, 5);
名前の付いた特別なシステムコレクションがあります
system.js
再利用のためにJavaScript関数を保存できます。
関数を保存するには、
db.collection.save()
、次の例のように:
db.system.js.save(
{
_id: "echoFunction",
value : function(x) { return x; }
}
);
db.system.js.save(
{
_id : "myAddFunction" ,
value : function (x, y){ return x + y; }
}
);
_ idフィールドは関数の名前を保持し、データベースごとに一意です。
valueフィールドは関数定義を保持します。
mongoシェルでは、次を使用できます
db.loadServerScripts()
現在のデータベースのsystem.js
コレクションに保存されているすべてのスクリプトをロードします。ロードされると、次の例のように、シェルで直接関数を呼び出すことができます。
db.loadServerScripts();
echoFunction(3);
myAddFunction(3, 5);
出典: MONGODB MANUAL
このように関数を呼び出すことができます
db.loadServerScripts();
db.data.insert({
_id: myFunction(5),
name: "TestStudent"
});
コマンドを使用して関数がdbに保存されている場合:
db.system.js.save(
{
_id : "myFunction" ,
value : function (x){ return x + 1; }
});
それが機能するためには$ whereを使用する必要があると思います!このようなもの:
db.urls.find( { needParse: false, $where: function(item){
if(item.date < cndTime) // check
db.urls.update({_id: item._id}, {$set: { needParse: true }});
詳細については、これをお読みください: https://docs.mongodb.com/manual/reference/operator/query/where/