2014-04-14 64 views
1

屬性的比較,我有這樣的文件MongoDB的查詢與自身

{ 
    "_id": ObjectId("524a498ee4b018b89437f88a"), 
    "counter": { 
    "0": { 
     "date": "2013.9", 
     "counter": NumberInt(1425) 
    }, 
    "1": { 
     "date": "2013.10", 
     "counter": NumberInt(1425) 
    } 
    }, 
    "profile": ObjectId("510576242b5e30877c654aff") 
} 

,我想搜尋那些,其中counter.0.counter不等於counter.1.counter

tryed

db.counter.find({"profile":ObjectId("510576242b5e30877c654aff"),"counter.0.counter":{$ne:"counter.1.counter"} }); 

但它說它不是一個有效的json查詢:/ 有幫助嗎?

+0

所以我真的希望你的數據看起來不像這個,它實際上是一個PHP轉儲。因爲這不是表示這種結構的好方法,所以我希望「counter」(頂層)實際上是一個** real **數組。 –

+0

好吧,這是它如何存儲在數據庫中,而計數器並不是一個真正的數組它是一個真正的哈希映射 –

+0

哈希映射不是一個理想的形式,但它實際上並沒有改變任何東西。你可能使用數組更好。 –

回答

2

兩件事。

除非使用JavaScript或使用聚合框架,否則實際上不能進行比較。與骨料的形式是更好的選擇:

db.collection.aggregate([ 
    { "$project": { 
     "counter": 1, 
     "matched": { "$eq": [ 
      "$counter.0.counter", 
      "$counter.1.counter" 
     ]} 
    }}, 
    { "$match": { "matched": true } } 
]) 

或者用不好使用JavaScript:

db.collection.find({ 
    "$where": function() { 
     return this.counter.0.counter == this.counter.1.counter; 
    } 
}) 

因此,這些都是可以做到這一點的方式。

大問題JavaScript的$where運營商有:

  • 調用JavaScript解釋器的每個結果文件評估,而不是本機代碼。

  • 刪除任何使用索引根據需要查找結果的機會。通過其他方法,您實際上可以使用具有單獨「匹配」條件的索引。但是這個運營商消除了這個機會

+0

我正在嘗試第二種方法,但不工作! – dikesh

+0

@Dikesh如果你真的閱讀了回覆,你不應該嘗試第二種方法。也不是你的問題,那麼你爲什麼在這裏? –

+0

聚合方法對我非常感謝 –