2017-08-07 141 views
2

我有一個查詢,在我的節點後端生成 - 如果我註銷並在Mongo shell中運行,那麼一切都很好,但是,如果我使用貓鼬做Model.find(query),那麼一些奇怪的屬性重新排序發生並且查詢中斷。貓鼬查詢改變對象順序

討論中的查詢是:

{ 
    "attributes": { 
     "$all": [ 
      { 
       "attribute": "an id", 
       "value": "a value", 
       "deletedOn": null 
      }, 
      { 
       "attribute": "an id again", 
       "value": "a value", 
       "deletedOn": null 
      } 
     ] 
    } 
} 

然而,從貓鼬調試輸出爲:

users.find({ 
    attributes: { 
     '$all': [ 
      { 
       deletedOn: null, 
       attribute: 'an id', 
       value: 'a value' 
      }, 
      { 
       deletedOn: null, 
       attribute: 'an id again', 
       value: 'a value' 
      } 
     ] 
    } 
}, 
    { fields: {} } 
) 

唯一的變化是deletedOn場的從最後位置在變速到第一位置物體。這意味着查詢不會返回任何結果。

有沒有解決這個問題的方法?

+0

http://mongoosejs.com/docs/guide.html#retainKeyOrder(雖然我不知道是否會在'$ all'工作)。 – robertklep

回答

0

JavaScript中的對象屬性爲未訂購。您無法確保JavaScript對象上的屬性順序,不同的實現可能會以不同的順序排列它們。有關其他信息,請參閱this answer on a related question

基本密鑰是從所述規範(ECMAScript中),我們得到:「一個目的是類型對象的成員它是特性的無序集合的每一個包含原始值,對象或功能。 。存儲在對象屬性中的函數稱爲方法。「

沒有「解決方案」,因爲這是預期的行爲。所以真正的問題是,爲什麼訂單對你很重要?你想做什麼?

+0

該命令很重要,因爲當查詢MongoDB {a:1,b:2}不等於{b:2. a:1}時 - mongo在屬性順序一致時使用BSON而不是JSON。 –

0

添加上一個答案,如果順序對您很重要,您應該使用數組而不是對象。

例如:

"$all": [ 
    [ 
     {"attribute": "an id"}, 
     {"value": "a value"}, 
     {"deletedOn": null}, 
    ], 
    ...etc. 
]