2016-12-07 4 views
2

Я оцениваю перенос базы данных SQL Server на MongoDb.Как вызвать сохраненный JavaScript в MongoDb с C#

Проблема заключается в перемещении хранимых процедур, я читал о сохраненном JavaScript в MongoDb, и я хотел бы пройти тест .Net. Я установил драйвер MongoDB 2.4.0 и создал эту функцию на MongoDb имени test_function:

function (x) 
{ 
    return x; 
} 

Это код, я использую, чтобы попытаться вызвать эту функцию:

MongoClient oMongoClient = new MongoClient(Properties.Settings.Default.MongoCN); 
IMongoDatabase oMongoDatabase = oMongoClient.GetDatabase("test_db"); 
var result = oMongoDatabase.RunCommand<BsonDocument>("test_function(3)"); 

Я получаю эту ошибку:

An unhandled exception of type 'System.FormatException' occurred in MongoDB.Bson.dll Additional information: JSON reader was expecting a value but found 'test_function'.

ответ

0

Я думаю, что вы можете использовать этот способ для запуска хранимыми сценарий:

var cmd = new JsonCommand<BsonDocument>("{ eval: \"test_function(2)\" }"); 
var result = db.RunCommand(cmd); 

Но результат в BsonDocument, чтобы получить правильный результат, который вы можете использовать эти методы:

var intResult = result["retval"].ToInt32(); 
+0

Когда функция возвращает номер, он отлично работает. Теперь я хочу попытаться вернуть список документов. я изменил функцию test_function на это: function (x, y) { return db.MyDB.find ({_ id: 1}); } Выполняется в shell mongo, он возвращает один документ. но из dotnet это не работает. – FDB

+0

@FDB AFAIK вы не можете получить результаты команд базы данных таким образом на C#, пожалуйста, задайте другой вопрос для этого, и я надеюсь, что кто-то ответит на него;). –

2

Точно такой же вопрос был здесь: MongoDB db.runCommand() from C#

Мой первый ответ был там, но я думаю, что это лучше сделать здесь.

Я думаю, что вы могли бы назвать с этим кодом:

var doc = new BsonDocument(new Dictionary<string, string> { { "test_function", "3" }}); 
var command = new BsonDocumentCommand<int>(doc); 
var result = db.RunCommand(command); 

Но, как вы могли видеть here, это действительно не рекомендуется использовать хранимые процедуры таким образом.

Я нашел другое решение здесь:

https://gist.github.com/jamesikanos/b5897b1693b5c3dd1f87

С помощью этого фрагмента кода, вы могли бы назвать вашу функцию так:

db.EvalAsync("test_function(2)").Result 
+0

спасибо, он по-прежнему бросает исключение: Необработанное исключение типа «MongoDB.Driver.MongoCommandException» произошло в MongoDB.Driver.Core.dll Дополнительной информации : Не удалось выполнить команду test_function: нет такого cmd: test_function. – FDB

+0

получил то же исключение. Извините, я нашел другой способ сделать это, см. Обновление ответа. –

+0

eval и EvalAsync были удалены в драйвере 2.4.0. Я думаю, что невозможно вызвать сохраненные js из клиента. Также нет способа перенести процедуры sql server storted в Mongo. Моя оценка окончена, я понял, что это невозможно. – FDB