2014-01-28 444 views
1

非常簡單,沒有任何類型的配置中檢索數據),我使用命令use meteor切換到分貝流星隨後進入一些基本數據,以測試:流星無法從MongoDB的

j = { name: "mongo" } 
k = { x: 3 } 

db.testData.insert(j) 
db.testData.insert(k) 

我檢查,並通過輸入得到的結果:db.testData.find()


這裏是我的流星代碼提供了MongoDB的訪問只需要在客戶端上:

if (Meteor.isClient) { 
    Template.hello.greeting = function() { 
     return "Welcome to test."; 
    }; 

    Template.hello.events({ 
     'click input' : function() { 
      // template data, if any, is available in 'this' 
      if (typeof console !== 'undefined') 
       console.log("You pressed the button"); 
     } 
    }); 

    Documents = new Meteor.Collection('testData'); 

    var document = Documents.find(); 
    console.log(document); 

    var documentCbResults = Documents.find(function(err, items) { 
     console.log(err); 
     console.log(items); 
    }); 
} 

在瀏覽器上的檢查和基於日誌,它說undefined。從mongodb中檢索數據並顯示到客戶端控制檯,我沒有成功。

我錯過了什麼?

回答

0

僅在客戶端定義集合是不夠的。您的mongo數據庫位於服務器上,您的客戶端需要從某處獲取數據。它不直接從mongodb(我認爲)獲得,而是通過與服務器上的集合同步來獲取它。

只需在客戶端和服務器的聯合範圍內定義Documents集合即可。您可能還需要等待訂閱Documents才能完成內容。所以更安全的是:

Meteor.subscribe('testData', function() { 
    var document = Documents.find(); 
    console.log(document); 
}); 
1

對於這個答案,我要承擔這與autopublish仍然在新創建的項目。

正如Christian指出的那樣,您需要在客戶端和服務器上定義Documents。您只需將集合定義放在文件頂部或另一個不在serverclient目錄中的文件中即可輕鬆完成此操作。

它打印前兩個測試文件可能看起來像這樣的一個例子:

Documents = new Meteor.Collection('testData'); 

if (Meteor.isClient) { 
    Template.hello.greeting = function() { 
    return "Welcome to apui."; 
    }; 

    Template.hello.events({ 
    'click input' : function() { 
     var documents = Documents.find().fetch(); 
     console.log(documents[0]); 
     console.log(documents[1]); 
    } 
    }); 
} 

注意以下幾點:

  • find函數返回一個cursor。編寫模板代碼時,這通常是您想要的。但是,在這種情況下,我們需要直接訪問文檔來打印它們,所以我在光標上使用了fetch。有關更多詳情,請參閱文檔。
  • 當您第一次啓動客戶端時,服務器將讀取定義的集合的內容,並將所有文檔(如果有autopublish)同步到客戶端的本地minimongo數據庫。我在點擊事件中放置了find以隱藏該同步時間。在您的代碼中,find將在客戶端啓動時立即執行,並且數據可能不會及時到達。

你將初始項目到數據庫作品(你不需要use meteor的方式)的方法,但是蒙戈將默認使用ObjectId,而不是一個字符串作爲_id的。有一些微妙的方式,這可能會在流星項目中令人討厭,所以我的建議是儘可能讓流星插入您的數據。下面是一些代碼,這將確保testData收集了一些文件:

if (Meteor.isServer) { 
    Meteor.startup(function() { 
    if (Documents.find().count() === 0) { 
     console.log('inserting test data'); 
     Documents.insert({name: "mongo"}); 
     Documents.insert({x: 3}); 
    } 
    }); 
} 

注意如果集合中有沒有文件,這將只執行。如果你想清除集合,你可以通過mongo控制檯來完成。或者,您可以刪除整個數據庫:

$ meteor reset