2016-08-02 38 views
5

如果我具有與以下類似結構的文檔。我正在用計算結果更新它們,我想知道結果是否已經插入到文檔中。假設我爲每個文檔運行計算'c'和計算'd'。現在我想顯示所有文檔的表格並顯示是否已經執行了計算'd'。對於這張表我不關心計算'c'。如何投影字段是否存在

{ 
"_id":1 
"a":1, 
"resultsOfComputation":{ 
    "c":{large embedded document}, 
    "d":{large embedded document} 
    } 
} 

{ 
"_id":2 
"a":1, 
"resultsOfComputation":{ 
    "c":{large embedded document} 
    } 
} 

我想得到一個結果,告訴我文檔是否包含特定字段。例如,我想知道它是否包含字段「resultsOfComputation.d」,無論該字段的值是多少。

的查詢「resultsOfComputation.d」的結果的一個例子是:

{ 
"_id":1 
"a":1, 
"resultsOfComputation":{ 
    "d":true 
    } 
} 

{ 
"_id":2 
"resultsOfComputation":{ 
    "d":false 
    } 
} 

如果「resultsOfComputation.d」是不是也可以未定義文件,這也是正常的:

{ 
"_id":1 
"a":1, 
"resultsOfComputation":{ 
    "d":true 
    } 
} 

{ 
"_id":2 
"a":1, 
"resultsOfComputation":{} 
} 

在一般情況下,這個想法是讓文件的所有根元素,但只有真/假/未定義計算的選擇(之一)的結果,因爲計算的結果是一個大的嵌入文檔。

回答

4

運行以下聚合管道得到想要的結果:

db.collection.aggregate([ 
    { 
     "$project": { 
      "a": 1, 
      "resultsOfComputation": { 
       "d": { "$gt": ["$resultsOfComputation.d", null] } 
      } 
     } 
    } 
]) 

樣本輸出

/* 1 */ 
{ 
    "_id" : 1, 
    "a" : 1, 
    "resultsOfComputation" : { 
     "d" : true 
    } 
} 

/* 2 */ 
{ 
    "_id" : 2, 
    "a" : 1, 
    "resultsOfComputation" : { 
     "d" : false 
    } 
} 
+1

我爲此查詢交口稱讚!哇!只是哇!但是,你能幫我理解一下'$ gt'是如何輸出真或假的? – Nattyk

+0

這[鏈接的答案](http://stackoverflow.com/a/29837432/122005)解釋了這一切。 – chridam

+0

這個答案很有用,不幸的是,使用聚合對我來說相當緩慢,特別是當我添加跳到管道時。最後,我只使用了find而不是aggregate,使用包含文檔的所有根元素和一個字段的投影,我知道這些字段總是位於「resultsOfComputation.d」中,然後檢查該字段是否未定義。 – Marcel

相關問題