2016-06-10 28 views
0

執行一些聚集魔術之後,我來到了這個數據:如果兩個字段相同,如何排除文檔?

{ "_id" : "5700edfe03fcdb000347bebb", "size" : 3, "count" : 2 } 
{ "_id" : "5700edfe03fcdb000347bebf", "size" : 2, "count" : 2 } 

現在,我要消除所有地方的大小等於計數的條目。

於是我就這樣聚集指令:

match3 = { "$match" : { "size" : { "$ne" : "count"} } } 

不過,這並不排除任何東西,因爲它是返回兩行。

我想要的結果是公正這一行,因爲它是唯一一所在大小不等於count:

{ "_id" : "5700edfe03fcdb000347bebb", "size" : 3, "count" : 2 } 

回答

1

你需要一個$redact階段添加到您的聚集管道:

{ "$redact": { 
    "$cond": [ 
     { "$eq": [ "$size", "$count" ] }, 
     "$$PRUNE", 
     "$$KEEP" 
    ] 
}} 
+0

感謝 - 這是正確的答案。 – Simon

+0

雖然這個答案是正確的,有沒有更有效的方式與$ ne匹配?使用編輯器的問題在於,您首先會按照某個標準進行匹配,例如,返回100個符合該條件的文檔。你在內存中修改它,這可能是內存密集型的。如果您將其與條件和$ ne聚合步驟相匹配,則可以返回20個文檔,這將節省內存。 – Simon

+0

@Simon我不知道我完全理解你的意思,但問題在於我們需要比較文檔中兩個字段的值,而我們不能用'$ match'來完成。 – styvane

-1

可以使用$where操作此

db.collection.find({ $where: "this.size != this.count" }) 
db.collection.remove({ $where: "this.size != this.count" }) 

更新: 我得到了downvoted後,我決定比較兩種解決方案。 兩者都使用COLLSCAN,兩者都返回相同的結果。 那麼請賜教我解決方案有什麼問題? :)

相關問題