2013-07-29 114 views
0

我試圖構建一個要傳遞給MongoDB的JavaScript對象。此數據庫使用運算符$or,它允許您一次搜索屬性中的多個鍵。在JavaScript對象中聲明不屬於字符串的屬性

因此,$or運算符不能用加引號,因爲它實際上是查找函數中的一個運算符。

僅供參考,查找函數如下:

db.inventory.find({ price:1.99, $or: [ { qty: { $lt: 20 } }, { sale: true } ] }) 

我已經找到一種方法來「打造」的$or屬性一些變數,但由於某些原因,屬性名一直被視爲雖然這是一個字符串。這裏是我的代碼:

var criteria = { $or: []}; 

    properties.forEach(function(property) { 
     var propParts = property.split('='); 
      if(!(propParts[1].indexOf('&') === -1)){ 
       var value = propParts[1].match(/[-'"\w\s]+/g); 
        for (var i = 0; i<value.length; i++){ 
         var tempObj = {}; 
         tempObj[propParts[0]] = value[i]; 
         criteria.$or.push(tempObj); 
        } 
      }else{  
      criteria[propParts[0]] = new RegExp(propParts[1], "i"); 
     } 
    }); 

if(criteria.$or.length<=0){ 
    delete criteria.$or; 
} 
console.log(criteria); 

在我的控制檯,這是被輸出爲:

{ '$or': [ { designer: 'abc' }, { designer: 'def' } ] } 

我使用類似的代碼在其他地方(與$push而不是$or),它工作得很好,我用完全相同的方式聲明它。

是否可以確保屬性不是被視爲字符串?我在這裏如何實現這一目標?

+0

'criteria ['$ or']'這是否返回對象? – rps

+0

@rps我不太確定你在問什麼。它返回數組,是的。 – Jascination

+0

我問,因爲我想知道爲什麼你想要的屬性是一個對象而不是一個字符串使用時,你可以得到對象本身?那是所有 – rps

回答

2

Javascript對象鍵總是被強制轉換爲字符串。您可以在對象文字{key: 0}或使用點符號object.key = 0中指定一些不帶引號的鍵,這僅僅是語法糖鍵,這些鍵也會與標識符的生產相匹配。 '$或' 是有效的JavaScript標識,因此可以說無論是:

{$or: [...]} 

{"$or": [...]} 

{'$or': [...]} 

,他們全是等價的。

+0

我覺得這是事實。有什麼方法可以確保它不會被引用周圍返回? – Jascination

+0

不是我所知道的。 JSON規範(http://www.json.org),它規範瞭如何傳輸和存儲Javascript對象字面值_requires_所有鍵都有雙引號,無論他們是否需要它們。 –

+0

明白了,實際上,MongoDB似乎並不介意'$或'是否在引號中,所以我的代碼中的其他地方一定有錯誤! – Jascination