2017-06-22 108 views
0

MongoDB中3.4.5覺得下面簡單集合ooo

{ "id" : 1, "to" : [ { "id" : 2 }, { "id" : 4, "valid" : true } ] } 

$redactto如果valid真:

db.ooo.aggregate([{ "$redact": { 
    "$cond": { 
     "if": { "$ne": [ "$valid", true] }, 
     "then": "$$KEEP", 
     "else": "$$PRUNE" 
    } 
}}]) 

結果:

{ "id" : 1, "to" : [ { "id" : 2 } ] } 

但是改變條件時,如果valid真:

db.ooo.aggregate([{ "$redact": { 
    "$cond": { 
     "if": { "$eq": [ "$valid", true] }, 
     "then": "$$KEEP", 
     "else": "$$PRUNE" 
    } 
}}]) 

結果是空的。

回答

0

$redact走從頂層整個文檔,然後向下時,"$valid": true部分不能轉嫁頂層(頂層有沒有valid場),那麼$$ROOT$$PRUNE d,並沒有返回。

解決方案(跳過這個問題,看看下面更新):

db.ooo.aggregate([{ "$redact": { 
    "$cond": { 
     "if": { $or: ["$to", {"$eq": [ "$valid", true]}] }, 
     "then": "$$KEEP", 
     "else": "$$PRUNE" 
    } 
}}]) 

UPDATE

基於@尼爾的評論,我糾正了答案

db.ooo.aggregate([{ "$redact": { 
    "$cond": { 
     "if": { $or: ["$to", {"$eq": [ "$valid", true]}] }, 
     "then": "$$DESCEND", 
     "else": "$$PRUNE" 
    } 
}}]) 

而預期結果如下:

{ "id" : 1, "to" : [ { "id" : 4, "valid" : true } ] } 

這就是{ "id" : 2 }被修剪。

+0

嗯。不,不是的。只有**時間它「走過雖然」是當你明確使用'$$ DESCEND',你沒有。因此,所有條件僅在「最高級別」**處進行評估**。似乎你誤讀了文檔。 [可能需要再次閱讀](https://docs.mongodb.com/manual/reference/operator/aggregation/redact/#descend) –