2017-03-01 65 views
0

儘管我認爲這是一個普遍問題,但我找不到符合我需求的解決方案。Meteor/Mongo - 如何從mongo集合中找到並返回特定字段?

我有2個mongo集合。 '用戶'集合和第二個'dbInfos'。

現在,我有一個名爲'Infos'的模板,並希望在存在集合中的數據的情況下,將mongo集合中已有的字段呈現給用戶輸入字段。當數據庫中沒有提供數據時,它應該是空的。

所以這裏是我的代碼,它工作正常,直到我想捕獲第二個集合中的字段。

Template.Infos.onRendered(function() { 

     $('#txtName').val(Meteor.user().profile.name); 
     $('#txtEmail').val(Meteor.user().emails[0].address); 

}); 

這2個工作很好。

但我不知道如何從集合'dbInfos'查詢信息,這不是'用戶'集合。顯然Meteor.user()。country不起作用,因爲它不在'用戶'集合中。也許找到({})查詢?但是,我不知道如何寫它。

$('#txtCountry').val(***query function***); 

關於「dbInfos」的結構: 每個對象都有一個_id等於給用戶id加上更多領域,如國家,城市等..

{ 
"_id": "12345", 
"country": "countryX", 
"city": "cityY" 
} 

此外,我怎麼能保證集合中的字段爲空時什麼都不顯示?或者這是自動的,因爲它只會返回一個空字段?

任何幫助,高度讚賞。謝謝!

編輯

我現在嘗試這樣做:

dbInfos.find({},{'country': 1, '_id': 0}) 

,我認爲這是正確的語法來檢索該國領域,surpress的_id字段的輸出。但是我只把[object Object]當作回報。

回答

1

你錯過了一個外鍵的想法。集合中的每個項目都需要一個由mongo(通常)分配的唯一密鑰。所以你的國家信息的關鍵是與userId相同是不正確的,但你很接近。相反,你可以參考用戶id是這樣的:

{ 
    "_id": "abc123", 
    "userId": "12345", 
    "country": "countryX", 
    "city": "cityY" 
} 

這裏,「ABC123」是特有的收藏和蒙戈分配的,「12345」是Meteor.users一些記錄的_id。

所以你可以找到像這樣(這將是在客戶端上,並且你將已經訂閱了DBInfos集合):

let userId = Meteor.userId(); 
let matchingInfos = DBInfos.find({userId: userId}); 

第一用戶id字段的名稱集合中,第二個是來自登錄用戶的本地變量。

更新:

好了,我想看到你要絆倒了。 find()和findOne()有區別。

find()返回一個遊標,這可能是你獲取[object object]的地方。 findOne()返回一個實際的對象。

對於兩者來說,第一個參數是一個過濾器,第二個參數是一個選項字段。例如

let cursor = DBInfos.find({ 
    userId: Meteor.userId() 
    }, 
    { 
    fields: { 
     country: 1 
    } 
    }); 

這是怎麼回事:

  1. 找到屬於用戶登錄的所有記錄
  2. 只使國家和可用
  3. _id領域作出這樣的形式提供數據一個光標

遊標允許您迭代結果,但它不是結果的JSON對象。例如,如果要在HTML中使用「{{#each}}」,則光標很方便。

,如果你只需要改變find()方法的findOne():

let result = DBInfos.findOne({ /** and the rest **/ 

...現在你確實有一個JSON結果對象。

,你也可以做)找到/讀取的組合,這就像一個findOne(:與結果

let result = DBInfos.find({ 
    userId: Meteor.userId() 
    }, 
    { 
    fields: { 
     country: 1 
    } 
    }).fetch(); 

,你現在就可以拿到國家:

let country = result.country; 

順便說一句,你不需要使用選項來獲取國家/地區。我一直假設所有這些代碼都在客戶端(可能是一個不好的假設)。所以這將工作得到國家以及:

let result = DBInfos.findOne({userId: Meteor.userId()}); 
let country = result.country; 

這是怎麼回事?就像上面那樣,但結果JSON可能會有更多的字段,而不僅僅是country和_id。 (這取決於發佈的內容)。

在服務器上執行find()時,我通常會使用options字段來限制發佈到客戶端的內容。在客戶端,如果您只需要抓取國家/地區字段,則不需要以這種方式指定選項。

在該選項中,您還可以對結果進行排序。當您要在遊標上迭代並且希望按照特定順序顯示結果時,在客戶端上可以很方便。

確實有意義嗎?那是什麼讓你失望?

+0

感謝這種方法,抱歉,我的答案來得如此之晚。雖然你的代碼幫助我通常在集合中找到一個字段,但它並不是我想要的。我認爲這種方法應該輸出Meteor.userId給我。然而,2件事情還沒有正確。首先,我不想要流星。userId()在字段中,但是「country」字段(我想我可以通過插入「country」字段來改變它,但其次,它不返回字段的值,它只返回「[object Object] 「你知道我怎樣才能得到」國家「的實際領域嗎?但是,謝謝! – Jaybruh

+0

@Jaybruh,我增加了一個大的更新部分,我希望我正確地猜測你在哪裏被絆倒。 – zim

+0

非常感謝你的所有但是,我嘗試了所有的解決方案,奇怪的是,它實際上可行,但不是在客戶端的$('#txtCountry')。val()字段中。 (國家:「CountryX」}。當我將代碼放入let country或var country並將其放入字段中時,我需要$('#txtCountry')。val(country) ,它只是再次將它顯示爲一個[對象對象] ...我現在將它放到超過數據庫的工作(Meteor.userId()),並將從它得到它e ...但是,謝謝! – Jaybruh

相關問題