2017-08-04 101 views
0

第一場我有一個看起來像這樣的文檔集合:的MongoDB:查詢在子文檔

{ 
    "_id": "12345", 
    "Company Name" : "Foo Inc.", 
    "Address": "123 bar street", 
    "Financials" : { 
      "Last Year" : "2016", 
      "Balance Sheet" : { 
       "2016" : { 
        "Total Assets" : 123.0, 
        "Current Assets" : 456.0, 
        "Current Liabilities" : 789.0, 
        "Shareholders Equity" : -123.0 
       }, 
       "2015": { 
        "Total Assets": 123.0, 
        "Current Assets": 456.0, 
        "Current Liabilities": 789.0, 
        "Shareholders Equity": -123.0 
       } 
      }, 
} 

我可以以某種方式查詢最近一年的總資產不知道是哪一年?類似於Financials.Balance表。{latest_year}。總資產。 理想我想這樣做對整個集合即

db.find({'Financials.Balance Sheet.{last_year}.Total Assets' : {$gt: 1000}}) 

我有最新的一年稱爲去年單獨的領域是否有幫助

+0

更多的是這裏選擇的文檔結構對於其預期目的而言非常糟糕的情況。將數組放在數組中而不是使用指定鍵會讓你變得更好。命名鍵是一個「anit-pattern」,不能通過計算被MongoDB「動態」查詢。保持一致的路徑是最佳選擇,然後您甚至可以「索引」數據以便更快地進行選擇。你不能用鑰匙做到這一點。 –

回答

0

您應該更新您的結構如下。

{ 
    "_id": "12345", 
    "Company Name": "Foo Inc.", 
    "Address": "123 bar street", 
    "Financials": { 
    "Last Year": 2016, 
    "Balance Sheet": [ 
     { 
     "year": 2016, 
     "Total Assets": 123, 
     "Current Assets": 456, 
     "Current Liabilities": 789, 
     "Shareholders Equity": -123 
     }, 
     { 
     "year": 2015, 
     "Total Assets": 123, 
     "Current Assets": 456, 
     "Current Liabilities": 789, 
     "Shareholders Equity": -123 
     } 
    ] 
    } 
} 

現在查詢是非常簡單

{'Financials.Balance Sheet" : {$elemMatch: {"year" : 2016, "Total Assets":{$gt:1000}}}} 

但因爲某些原因,如果你不能改變你的結構,可以在當前3.4版本使用下面聚集查詢。

{ 
    "$redact": { 
    "$cond": [ 
     { 
     "$let": { 
      "vars": { 
      "first": { 
       "$arrayElemAt": [ 
       { 
        "$objectToArray": "$Financials.Balance Sheet" 
       }, 
       0 
       ] 
      } 
      }, 
      "in": { 
      "$gt": [ 
       "$$first.v.Total Assets", 
       1000 
      ] 
      } 
     } 
     }, 
     "$$KEEP", 
     "$$PRUNE" 
    ] 
    } 
}