2017-06-18 44 views
2

我得到這個錯誤

this.update(
      {}, { 
       $pull: { 
        words: { 
         $in:['string', 'string1'] 
        } 
       } 
      }, { 
       multi: true 
      }); 

我是一個ES6類中調用該在客戶端擴展Mongo.Collection,到目前爲止,其他所有內容(插入,刪除)都起作用了,我沒有以任何方式修改更新方法。集合是一個local collection這樣聲明:

WordsList = new WordCollection('words', {connection: null});)

查詢是非常相似的示例文件here中,實際上,我可以同時試圖重新在控制檯上這個例子中,同樣再現了同樣的錯誤。

I'm using Meteor 1.4.4.1 with MongoDB 3.2.12

出於某種原因,我還不能拖住,我可以跟蹤誤差蒙戈編譯查詢映射它的邏輯運算符($和$或),而不是元素(對比查詢)操作符($ in,$ eq)

+1

我不認爲流星允許那種更新沒有具體的文件'_id'。另外,在瀏覽器客戶端中可能不適用於Minimongo,但這是「服務器端」的有效語法。所以也許你應該使用服務器方法。 –

+0

那麼文檔中的示例不會傳遞一個id,它意味着適用於所有匹配的文檔。另外(忘記提及),這是一個客戶端集合(傳遞{connection:null}作爲第二個參數),將在帖子中更新它。 – lvlzqz

+0

我認爲您在這裏混淆了文檔來源。 MongoDB核心文檔列出了'$ pull'的正確語法選項,這是一個有效的語句。 Meteor ['.update()'](https://docs.meteor.com/api/collections.html#Mongo-Collection-update)在實施時認爲「不受信任」的客戶端代碼在不包括特定文檔時無效'_id'。除非你專門確保了這個方法,否則它將不被允許。我認爲你真的需要執行這個[服務器方法](https://guide.meteor.com/methods.html) –

回答

1

可以修改本地集合中的多個值,但是可以使用哪些選擇器或修飾符有限制,因爲客戶端收集用戶MiniMongo實現了一個子集MongoDB功能。

這種特殊的情況下是MiniMongo,其中一個邏輯Matcher$pull表達式中使用,如在$pull執行在註釋指示的一個缺點:

// XXX Minimongo.Matcher isn't up for the job, because we need 
    // to permit stuff like {$pull: {a: {$gt: 4}}}.. something 
    // like {$gt: 4} is not normally a complete selector. 
    // same issue as $elemMatch possibly? 

(source : Meteor source code)

這是從2013年,所以有沒有公關就沒有多少希望改變它。

具體而言,匹配器只允許您使用邏輯選擇器:"$and", "$or", "$nor", "$where", "$comment"。這就是爲什麼你不能使用$in,這是在ELEMENT_OPERATORS實施。

作爲一種變通方法(和,因爲這是唯一的客戶端),你可以使用:

valueArray.forEach(val => WordsList.update({}, {$pull: {words: val}}, {multi: true})); 
+0

謝謝你!我不幸沒有足夠的聲望投票給你,但你明確表達了並提供了一個可行的解決方案 – lvlzqz

+0

繼續問好問題,你很快就會:)無論如何,如果這個答案解決了問題,你可以接受 答案。 – MasterAM

+0

看起來我越來越近了! – lvlzqz