Meteor API Collections

流星將數據存儲在集合中。 首先,使用新的Mongo.Collection聲明一個集合。

集合的名稱。 如果為null,則創建一個非托管(未同步)的本地集合。

將管理此集合的服務器連接。 如果未指定,則使用默認連接。 傳遞調用DDP.connect的返回值來指定一個不同的服務器。 通過null來指定沒有連接。 非托管(名稱為空)集合無法指定連接。

轉換函數

一個可選的轉換函數。 文件在從fetch或findOne返回之前,在傳遞給觀察,映射,forEach,allow和deny的回調函數之前將通過此函數傳遞。 對于observeChanges的回調或從發布函數返回的游標,轉換不適用。

設置為false可跳過設置允許從客戶端代碼插入/更新/刪除的突變方法。 默認為true。

調用這個函數類似于在傳統的ORM(Object-Relation Mapper)對象框架中聲明一個模型。 它建立一個可用于存儲特定類型信息的集合(記錄存儲空間或“文檔”),如用戶,帖子,分數,待辦事項或任何與您應用程序有關的事物。 每個文檔都是一個EJSON對象。 它包含一個_id屬性,其值在集合中是唯一的,當您第一次創建文檔時,Meteor將設置它。

該函數返回一個對象,其中包含將文檔插入到集合中的方法,更新其屬性并將其刪除,并查找符合任意條件的集合中的文檔。 這些方法的工作方式與流行的Mongo數據庫API兼容。 相同的數據庫API可以在客戶端和服務器上工作(見下文)。

如果您在創建集合時傳遞了一個名稱,那么您正在聲明一個持久集合?-一個存儲在服務器上并被所有用戶看到的集合。 客戶端代碼和服務器代碼都可以使用相同的API訪問相同的集合。

具體來說,當你傳遞一個名字時,會發生以下情況:

在服務器上(如果您不指定連接),將在后端Mongo服務器上創建具有該名稱的集合。當你在服務器上調用這個集合上的方法時,它們直接轉換成正常的Mongo操作(在檢查它們符合你的訪問控制規則之后)。

在客戶端上(如果指定連接,則在服務器上),創建一個Minimongo實例。?Minimongo本質上是純JavaScript中的內存中非持久化的Mongo實現。它充當本地緩存,僅存儲該客戶端正在使用的數據庫的子集。對這些集合的查詢(查找)直接從這個緩存中提供,而不與服務器通話。

當你寫入到客戶端的數據庫(插入,更新,刪除)時,命令立即在本地執行,并且同時發送到服務器并在那里執行。這通過存根發生,因為寫入是作為方法實現的。

在服務器上寫入到與另一臺服務器有指定連接的集合時,它會將相應的方法發送到另一臺服務器,并通過DDP從其接收更改后的值。 與客戶端不同,它不首先在本地執行寫入。

如果您傳遞null作為名稱,那么您正在創建一個本地集合。 它不在任何地方同步。 它只是一個本地暫存器,支持Mongo風格的查找,插入,更新和刪除操作。 (在客戶端和服務器上,這個暫存器都是用Minimongo來實現的。)

默認情況下,Meteor將自動收集每個文檔到每個連接的客戶端。 要關閉此行為,請刪除終端中的autopublish包:

而是調用Meteor.publish來指定哪些部分應該發布給哪些用戶。

一般來說,您將在應用程序中將Mongo.Collection對象分配給全局變量。 您只能為每個基礎Mongo集合創建一個Mongo.Collection對象。

如果您為集合或其任何檢索方法指定了一個轉換選項,那么文檔將在返回或傳遞給回調之前通過轉換函數傳遞。 這使您可以添加方法或以其他方式從數據庫表示中修改集合的內容。 您也可以在特定查找,findOne,允許或拒絕呼叫中指定轉換。 轉換函數必須返回一個對象,并且它們不能改變文檔的_id字段的值(盡管可以忽略它)。

變換函數不被稱為被動的。 如果要將動態更改的屬性添加到對象,請使用在調用時計算值的函數,而不是在變換時計算屬性。

在這個版本中,Minimongo有一些限制:

修改器中的$ pull只能接受某些類型的選擇器。

findAndModify,聚合函數和map / reduce不受支持。

所有這些將在未來的版本中解決。有關完整的Minimongo發行說明,請參閱存儲庫中的packages / minimongo / NOTES。

Minimongo目前沒有索引。 這很少會成為一個問題,因為客戶擁有足夠的數據以至于索引是值得的。

查找返回一個游標。 它不會立即訪問數據庫或返回文檔。 游標提供獲取返回所有匹配的文件,映射和forEach遍歷所有匹配的文件,并觀察和觀察變化注冊回調,當匹配的文件組更改。 游標也實現ES2015的迭代協議。

集合游標不是查詢快照。 如果數據庫在調用Collection.find和獲取游標結果之間或在從游標中獲取結果時發生變化,那么這些變化可能會出現在結果集中,也可能不會出現在結果集中。

游標是一個被動數據源。 在客戶端,第一次在反應計算(例如模板或自動運行)中檢索游標的文檔,包括fetch,map或forEach時,Meteor將注冊對基礎數據的依賴關系。 對更改光標中文檔的集合的任何更改都會觸發重新計算。 要禁用此行為,請將{reactive:false}作為選項進行查找。

請注意,指定字段時,只有對包含字段的更改才會觸發觀察,觀察更改和回調計算中的使用此光標的無效計算中的回調。 仔細使用字段允許對不依賴整個文檔的計算實現更精細的反應。

在客戶端,從加載頁面到發布數據從服務器到達您的客戶端集合為空時,將會有一段時間。

按排序和跳過選項排序,查找與選擇器匹配的第一個文檔。 如果未找到匹配的文檔,則返回undefined。

在集合中插入一個文檔。 返回其唯一的_id。

要插入的文檔。 可能還沒有_id屬性,在這種情況下Meteor會為你生成一個屬性。

可選的。 如果存在,用一個錯誤對象作為第一個參數調用,如果沒有錯誤,則_id作為第二個參數。

將文檔添加到集合中。 文檔只是一個對象,其字段可以包含EJSON兼容數據類型(數組,對象,數字,字符串,null,true和false)的任意組合。

插入將為您傳遞的對象生成唯一的ID,將其插入到數據庫中,然后返回ID。 當從不可信的客戶端代碼調用插入時,只有在傳遞任何適用的允許和拒絕規則時才允許插入。

在服務器上,如果不提供回調,則插入塊直到數據庫確認寫入,否則在出錯時引發異常。 如果您提供回調,插入仍然立即返回ID。 一旦插入完成(或失敗),回調將被調用,并帶有錯誤和結果參數。 在錯誤情況下,結果是未定義的。 如果插入成功,錯誤是未定義的,結果是新的文檔ID。

在客戶端,插入永不阻止。 如果您沒有提供回調,并且服務器上的插入失敗,那么Meteor將向控制臺發出警告。 如果你提供了一個回調,Meteor會用錯誤和結果參數來調用這個函數。 在錯誤情況下,結果是未定義的。 如果插入成功,錯誤是未定義的,結果是新的文檔ID。

修改集合中的一個或多個文檔。 返回匹配文檔的數量。

指定要修改的文檔

指定如何修改文檔

可選的。 如果存在,則用錯誤對象作為第一個參數調用,如果沒有錯誤,則將受影響的文檔數作為第二個參數。

確實修改所有匹配的文件;為false只修改其中一個匹配文檔(默認)。

如果沒有找到匹配的文檔,則為真即插入文檔。

根據修飾符修改與選擇器匹配的文檔(請參閱修改器文檔)。

更新的行為取決于它是由受信任的或不受信任的代碼調用。 受信任的代碼包括服務器代碼和方法代碼。 不受信任的代碼包括客戶端代碼,如事件處理程序和瀏覽器的JavaScript控制臺。

可信代碼可以通過將multi設置為true來同時修改多個文檔,并且可以使用任意的Mongo選擇器來查找要修改的文檔。 它繞過了允許和拒絕設置的任何訪問控制規則。 如果您未通過回叫,受影響文件的數量將從更新通話中返回。

不受信任的代碼只能一次性修改單個文檔,由其_id指定。 只有在檢查任何適用的允許和拒絕規則后才允許修改。 受影響的文檔數量將返回到回調。 不受信任的代碼不能執行upserts,除非在不安全的模式下。

在服務器上,如果不提供回調,則更新數據塊直到數據庫確認寫入,否則在出錯時引發異常。 如果您提供回調,則立即返回更新。 更新完成后,如果失敗,則使用單個錯誤參數調用回調,如果更新成功,則使用第二個參數指示受影響的文檔數。

在客戶端上,更新永遠不會阻塞。 如果您不提供回調,并且服務器上的更新失敗,那么Meteor將向控制臺發出警告。 如果您提供回調,則Meteor會在出現錯誤時使用錯誤參數調用該函數,如果更新成功,則會使用第二個參數指示受影響的文檔的數量。

你可以使用update來設置upsert選項為true來執行Mongo upsert。 您還可以使用upsert方法執行一個upsert,除了受影響的文檔數量外,還會返回插入的文檔的_id(如果有的話)。

修改集合中的一個或多個文檔,或者如果找不到匹配的文檔,則插入一個。 返回鍵為numberAffected的對象(已修改的文檔數)和insertedId(插入的文檔的唯一_id,如果有的話)。

根據修飾符修改與選擇器匹配的文檔,或者如果沒有文檔被修改,則插入文檔。?upsert與upsert選項設置為true時調用update相同,除了upsert的返回值是包含關鍵字numberAffected和insertedId的對象。 (更新只返回受影響文檔的數量。)

找到與選擇器匹配的所有文檔,并將其從集合中刪除。

刪除行為取決于它是由受信任的或不受信任的代碼調用。 受信任的代碼包括服務器代碼和方法代碼。 不受信任的代碼包括客戶端代碼,如事件處理程序和瀏覽器的JavaScript控制臺。

受信任的代碼可以使用任意的Mongo選擇器來查找要刪除的文檔,并且可以通過傳遞與多個文檔匹配的選擇器來一次刪除多個文檔。 它繞過了允許和拒絕設置的任何訪問控制規則。 如果您未傳遞回叫,則刪除的文檔數將從刪除中返回。

作為安全措施,如果省略選擇器(或未定義),則不會刪除任何文檔。 如果您確實要從集合中刪除所有文檔,請將選擇器設置為{}。

不受信任的代碼一次只能刪除單個文檔,由其_id指定。 只有在檢查任何適用的允許和拒絕規則后,文檔才被刪除。 被刪除的文件的數量將被返回到回調。

在服務器上,如果不提供回調,則刪除塊直到數據庫確認寫入,然后返回已刪除文檔的數量,否則在出錯時引發異常。 如果您提供回調,請立即刪除退貨。 一旦刪除完成,回調在失敗的情況下被調用一個錯誤參數,或者如果刪除成功,則第二個參數指示被刪除的文檔的數量。

在客戶端上,刪除從不阻止。 如果您不提供回調,并且在服務器上刪除失敗,那么Meteor將向控制臺發出警告。 如果提供回調,則Meteor會在出現錯誤時使用錯誤參數調用該函數,如果移除成功,則會使用第二個參數指示已移除文檔的數量。

允許用戶直接從客戶端代碼寫入這個集合,但要受到您定義的限制。

雖然允許和拒絕使得開始構建應用程序變得容易,但是似乎編寫安全允許和拒絕規則似乎更困難。 我們建議開發人員避免允許和拒絕,并在他們準備從應用程序中刪除不安全模式時直接切換到自定義方法。 有關更多詳細信息,請參閱關于安全的流星指南。

當客戶端調用插入,更新或刪除集合時,集合的允許和拒絕回調將在服務器上調用,以確定是否允許寫入。 如果至少有一個允許回調允許寫入,并且沒有拒絕回調否認寫入,則允許寫入繼續。

這些檢查僅在客戶端試圖直接寫入數據庫時運行,例如通過調用事件處理程序中的更新。 服務器代碼是可信的,不受限制和拒絕。 這包括用Meteor.call調用的方法?-它們被期望進行自己的訪問檢查,而不是依賴允許和拒絕。

您可以根據需要多次呼叫允許,每個呼叫可以包含插入,更新和刪除功能的任意組合。 如果他們認為這個操作應該被允許的話,函數應該返回true。 否則,他們應該返回false,或者什么也沒有(undefined)。 在這種情況下,流星將繼續搜索收集中的任何其他允許規則。

用戶userId想要將文檔文檔插入到集合中。 如果允許,返回true。

doc將包含_id字段,如果一個是由客戶端顯式設置,或者如果有一個活動轉換。 你可以使用這個來防止用戶指定任意的_id字段。

用戶userId想要更新文檔文檔。 (doc是來自數據庫的文檔的當前版本,沒有建議的更新。)返回true以允許更改。

只支持Mongo修飾符(像$ set和$ push這樣的操作)。 如果用戶試圖替換整個文檔而不是使用$ --modifiers,那么請求將被拒絕,而不檢查允許的功能。

用戶userId想要從數據庫中刪除文檔。 返回true來允許這個。

當調用更新或刪除Meteor將默認從數據庫中獲取整個文檔文檔。 如果你有大的文檔,你可能只想獲取你的函數實際使用的字段。 通過將fetch設置為要檢索的字段名稱數組來完成此操作。

如果您從未在集合上設置任何允許規則,則所有寫入集合的客戶端都將被拒絕,并且只能從服務器端代碼寫入集合。 在這種情況下,您將不得不為客戶端允許的每個可能的寫入創建一個方法。 然后,您將使用Meteor.call調用這些方法,而不是讓客戶端直接在集合上調用插入,更新和刪除。

流星還有一個特殊的“不安全模式”,用于快速建立新應用程序的原型。 在不安全的模式下,如果您還沒有在集合上設置任何允許或拒絕規則,則所有用戶都具有對集合的完全寫入權限。 這是不安全模式的唯一影響。 如果您在某個集合(甚至是Posts.allow({})上調用允許或拒絕,則在該集合上對訪問進行檢查就像正常一樣。 新流星項目默認情況下以不安全模式啟動。 要關閉它,只需在終端中運行:

查看對數據庫的建議修改的函數,如果應該被拒絕,則返回true,即使允許規則另有說明。

可選的性能增強。 限制將從數據庫中提取的字段,以便通過更新進行檢查并刪除函數。

覆蓋對集合的轉換。 通過null來禁用轉換。

雖然允許和拒絕使得開始構建應用程序變得容易,但是似乎編寫安全允許和拒絕規則似乎更困難。 我們建議開發人員避免允許和拒絕,并在他們準備從應用程序中刪除不安全模式時直接切換到自定義方法。 有關更多詳細信息,請參閱關于安全的流星指南。

這就像允許,除非它允許你確保某些寫入被肯定拒絕,即使有一個允許規則說明他們應該被允許。

當客戶端嘗試寫入集合時,Meteor服務器首先檢查集合的拒絕規則。 如果沒有一個返回true,那么它會檢查該集合的允許規則。 只有當沒有拒絕規則返回true并且至少有一個允許規則返回true時,Meteor才允許寫入。

從Mongo.Collection包裝的npm mongodb驅動程序模塊返回與此集合對應的Collection對象。

從由Mongo.Collection包裝的npm mongodb驅動程序模塊返回與此集合的數據庫連接對應的Db對象。

要創建一個游標,使用find。 要訪問游標中的文檔,請使用forEach,map,fetch或ES2015的迭代協議。

為每個匹配的文檔,按順序和同步調用一次回調。

該接口與Array.forEach兼容。

當從被動計算中調用時,forEach注冊對匹配文檔的依賴關系。

映射所有匹配文件的回調。 返回一個數組。

該接口與Array.map兼容。

當從被動計算中調用時,映射寄存器對匹配文檔的依賴關系。

在服務器上,如果回調產生,在第一個呼叫等待期間可能發生其他回呼。 如果需要嚴格的順序執行,請使用forEach。

以數組形式返回所有匹配的文檔。

當從被動計算中調用時,獲取寄存器對匹配文檔的依賴關系。

返回與查詢匹配的文檔數量。

如同其他功能一樣,只計算匹配文檔數量的依賴性。 (只更改或重新排序結果集中文檔的更新不會觸發重新計算。)

觀看一個查詢。 在結果集更改時接收回調。

建立一個實時查詢,當查詢結果發生變化時調用回調。 回調會收到受影響文檔的全部內容以及舊內容(如果適用)。 如果您只需要接收更改的字段,請參閱observeChanges。

當您不關心結果集中文檔的順序時,使用添加,更改和刪除。 他們比添加更有效率,更改了,并刪除了。

在觀察返回之前,添加(或addedAt)將被調用零次或更多次來傳遞查詢的初始結果。

觀察返回一個實時查詢句柄,這是一個停止方法的對象。 呼叫停止沒有參數停止調用回調函數并拆除查詢。 查詢將永遠運行,直到你打電話給這個。 如果從Tracker.autorun計算中調用觀察,則在重新運行或停止計算時會自動停止觀察。 (如果光標是通過選項reactive設置為false創建的,則只會傳遞初始結果,不會調用任何進一步的回調;不需要在句柄上調用stop。)

觀看一個查詢。 在結果集更改時接收回調。 只有舊文件和新文件之間的差異傳遞給回調。

監聽一個實時查詢,當查詢結果發生變化時調用回調。 與觀察相反,observeChanges僅提供新舊結果集之間的差異,而不是所更改文檔的全部內容。

如果不使用addedBefore或movedBefore,observeChanges會顯著更高效。

在observeChanges返回之前,添加(或addedBefore)將被調用零次或多次來傳遞查詢的初始結果。

observeChanges返回一個活動的查詢句柄,它是一個停止方法的對象。 呼叫停止沒有參數停止調用回調函數并拆除查詢。 查詢將永遠運行,直到你打電話給這個。 如果從Tracker.autorun計算中調用observeChanges,則在重新運行或停止計算時會自動停止。 (如果光標是通過選項reactive設置為false創建的,則只會傳遞初始結果,不會調用任何進一步的回調;不需要在句柄上調用stop。)

不像觀察,觀察變化不提供絕對的位置信息(即,在指數位置,而不是位置之前)。這是為了效率。

創建一個Mongo風格的ObjectID。如果不指定hexString,則ObjectID將隨機生成(不使用MongoDB的ID構造規則)。

可選的。 要創建的ObjectID的24個字符的十六進制內容

Mongo.ObjectID遵循與Node MongoDB驅動程序ObjectID類相同的API。請注意,您必須使用equals方法(或EJSON.equals)來比較它們; ===運算符將不起作用。如果您正在編寫需要處理可能是字符串或ObjectID的_id字段的泛型代碼,請使用EJSON.equals而不是===來比較它們。

由Meteor創建的ObjectID值不會有getTimestamp方法的有意義的答案,因為Meteor目前完全隨機地構造它們。

最簡單的選擇器只是一個字符串或Mongo.ObjectID。 這些選擇器將文檔與其_id字段中的值匹配。

一個稍微復雜的選擇器形式是一個包含必須在文檔中匹配的一組鍵的對象:

但是他們也可以包含更復雜的測試:

See the complete documentation.

修飾符是一個對象,它描述了如何通過改變其中的一些字段來更新文檔。 一些例子:

但是,如果一個修飾符不包含任何$ -operators,那么它將被解釋為一個文字文檔,并完全替代以前在數據庫中的任何東西。 (Literal文檔修飾符當前不被驗證的更新支持。)

排序可以使用您選擇的幾種語法來指定:

最后的形式只有在你的JavaScript實現保留了對象中鍵的順序的情況下才能工作。 大多數情況下,大部分時間都這樣做,但這取決于你自己。

對于本地集合,您可以傳遞一個比較函數,它接收兩個文檔對象,如果第一個文檔第一個按順序排列,則返回-1;如果第二個文檔排在第一個,則返回1;如果兩個文檔都不在另一個之前,則返回0。 這是MongoDB的Minimongo擴展。

查詢可以指定一組特定的字段來包含或從結果對象中排除。

要從結果對象中排除特定字段,字段說明符是一個字典,其鍵是字段名,值為0.所有未指定的字段都包含在內。

要僅包含結果文檔中的特定字段,請使用1作為值。?_id字段仍然包含在結果中。

除了一個例外,不能混合包含和排除樣式:鍵必須全部為1或全為0.例外是,您可以在包含說明符中指定_id:0,這將使_id超出結果對象 以及。 但是,此類字段說明符不能與observeChanges,觀察,從發布函數返回的游標或模板中的{{#each}}中使用的游標一起使用。 它們可以與fetch,findOne,forEach和map一起使用。

例如$和$ elemMatch等字段操作符在客戶端尚不可用。

一個更高級的例子:

在開發應用程序時,Meteor啟動一個本地MongoDB實例并自動連接到它。 在生產環境中,您必須以標準的mongo連接字符串格式指定一個指向數據庫的MONGO_URL環境變量。

如果你想連接到不同的MongoDB實例,你也可以在開發中設置MONGO_URL。

如果你想使用oplog tailing進行livequeries,你還應該設置MONGO_OPLOG_URL(通常你需要一個特殊的用戶來訪問oplog,但是細節可以根據MongoDB的不同而有所不同)。

從Meteor 1.4開始,您必須確保您在METEOR_OPLOG_URL上設置了replicaSet參數

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 關于Mongodb的全面總結 MongoDB的內部構造《MongoDB The Definitive Guide》...
    中v中閱讀 32,038評論 2 89
  • hello,先祝大家中秋快樂,吃嘛嘛香,該吃吃,該喝喝,有事別往心里擱..... 這是本人用谷歌翻譯的meteor...
    與時間賽跑_閱讀 1,136評論 0 0
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,446評論 25 708
  • 墨綿/文 第38章 戰事 “娘娘,她來了”一個裝扮極為精致的小丫鬟小聲的說道。 “讓她在前廳等著”過了好半響,隔著...
    桃花塢主_墨綿閱讀 591評論 0 2
  • 文/唐老鴨 今天是西方的“愚人節”,你被愚和愚人了嗎? 這個在19世紀就在西方國家流行過的,民間的傳統節日,不知什...
    湘女梅子閱讀 296評論 18 7