2014-09-19 115 views
1

我已經做了一些研究,似乎可以使用聚合框架查詢(即比較)同一集合中的兩個字段。使用$ where操作符也是可行的,但我想避免使用低性能的Javascript解決方案。MongoDb:查詢集合自己的字段

下面是一個例子文件:

{ 
    "_id" : ObjectId("541ba14d2208236d06ff1e57"), 
    "a" : "foo", 
    "d" : { 
     "e" : "foo" 
    } 
} 
{ 
    "_id" : ObjectId("541ba14d2208236d06ff1e58"), 
    "a" : "foo", 
    "d" : { 
     "e" : "bar" 
    } 
} 

我想去撿文件,其中 'A'= 'D.E'!。我已經嘗試以下沒有成功: db.test.aggregate([{$match: {$ne: ['$a', '$d.e']}}]);

回答

1

至於你說的查詢可以用JavaScript在查詢中發出條件來完成:

db.test.find(function() { return this.a != this.d.e }) 

哪家的縮寫形式查詢。

雖然您可以在聚合框架中執行其他操作,但它不會改變查詢的基本性質,因爲您無法放置查詢條件來比較兩個字段的值。這就是爲什麼只有$match不能這樣做,因爲它遵循相同的規則。

什麼「can」 do是$project另一個字段值匹配您要強制執行的相同邏輯條件。根據您的實際執行情況,這可能是也可能不是獲得更好的性能:

db.test.aggregate([ 
    { "$project": { 
     "a": 1, 
     "d": 1, 
     "notEqual": { "$ne": [ "$a", "$d.e" ] } 
    }}, 
    { "$match": { "notEqual": true } } 
]) 

這可能是不會做出很大的意義在它自己的,除非一些其他的過濾是整個過程中完成的,但。但是通常的比較是通過comparison operator來完成的,以返回可以被過濾的真/假結果。

所以如果可以的話,最好的辦法就是用文檔中出現的字段以類似的方式實際維護結果。然後你有一個基本的查詢條件來查找該值,而不是比較。這是如果你需要定期做這些檢查。

但是對於「臨時」目的,您要麼堅持使用JavaScript評估,要麼在彙總查詢中使用「投影」表單(無法使用$ where子句)以執行字段級比較。