2014-01-16 4 views
0

Я пытаюсь вернуть результаты запроса monogdb в веб-приложение. Простейший начальный один был просто вернуть всю коллекцию, как вы увидите его в консоли MongoDB из WebService вызова в рамках проекта, который имеет доступ к базе данных:коллекция mongodb через webservice C#

> db.usercollection.find() 
{ "_id" : ObjectId("52d2f2b3c60804b25bc5d2ca"), "username" : "testuser1", "email 
    " : "[email protected]" } 
{ "_id" : ObjectId("52d2f2f9c60804b25bc5d2cb"), "username" : "testuser2", "email 
    " : "[email protected]" } 
{ "_id" : ObjectId("52d2f2f9c60804b25bc5d2cc"), "username" : "testuser3", "email 
    " : "[email protected]" } 
> 

Я хотел бы получить в результате JSON в ExtJS сетка. Я пытаюсь способами, чтобы увидеть, если он работает, но первый вопрос на самом деле, как вернуть предыдущий результат:

<WebMethod()> _ 
<ScriptMethod(UseHttpGet:=True, ResponseFormat:=ResponseFormat.Json)> _ 
Public Function getDBData() As String 

    Dim response As String = String.Empty 

    mongo.Connect() 
    Dim db = mongo.GetDatabase("nodetest1") 

    Using mongo.RequestStart(db) 
     Dim collection = db.GetCollection(Of BsonDocument)("usercollection").FindAll() 

     response = collection.Collection.ToString 

     Return response 
    End Using 

я не вижу результат я хочу здесь:

var newStore = Ext.create('Ext.data.JsonStore', { 
    model: 'User', 
    proxy: { 
     type: 'ajax', 
     url: 'http://localhost:52856/WCFService/WebService1.asmx/getDBData', 
     reader: { 
      type: 'json', 
      root: 'd', 
      idProperty: '_id', 
      successProperty: 'success' 
     }, 
     success: function (response, options) { 
      var s = response.responseText; 
      Ext.MessageBox.alert(s, 'LA LA LA'); 
      newStore.loadData(s); 
     }, 
     failure: function (response, options) { 
      Ext.MessageBox.alert('FAILED AGAIN', 'SUCKS'); 
     } 
    } 
}); 

Я попытался добавить корень следующим образом:

 response = "{""d"":" + response + "}" 

     Return response 

Вторая альтернатива для вызова службы от Node.js напрямую, а не показать, как настроить результат также:

Ext.Ajax.request({ 
    url: 'http://localhost:3000/userlist', 
    method: 'GET', 
    success: function (response, options) { 
     var s = response.responseText; 
     Ext.MessageBox.alert(s, 'WOO WOO'); 
     myStore.loadData(s); 
    }, 
    failure: function (response, options) { 
     Ext.MessageBox.alert('FAILED MOFO', 'Unable to GET'); 
    } 
}); 

Это то, что я получаю обратно:

nodetest1.usercollection 

Вид: список пользователей

extends layout 

block content 
h1. 
    User List 
u1 
each user, i in userlist 
    li 
     a(href="mailto:#{user.email}")= user.username 

маршрут по умолчанию:

exports.index = function(db) { 
return function(req, res) { 
var collection = db.get('usercollection'); 
collection.find({},{}, function(e,docs){ 
     res.render('userlist', { 
      "userlist" : docs 
     }); 
}); 
}; 

};

Я ухожу отсюда или может кто-то увидеть, что я делаю неправильно.

ответ

2

Звонок FindAll возвращает MongoCursor.

Быстрый способ конвертировать, что в формат JSON будет:

Return collection.ToArray().ToJSON() 

Вы могли бы перебрать каждый результат с помощью метода так:

For Each document in collection 
    ' do something with each document 
Next document 

В зависимости от размера результатов , вы можете обнаружить, что при возврате ответа используется много серверной памяти и занимает значительное количество времени для передачи и обработки в JavaScript.

Кроме того, для производственного кода я бы рекомендовал, чтобы соединение с MongoDB создавалось только один раз. Соединение является потокобезопасным и многоразовым (и использует пул соединений для поддержки нескольких клиентов). Открытие и закрытие соединений «дорого».

Смежные вопросы