2017-08-04 8 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 Sheetのようなもの。{latest_year}。総資産。 は、理想的には私はそれはあなたが以下にあなたの構造を更新する必要があり

+0

ここで選択されたドキュメント構造は意図した目的にはかなり悪い場合があります。名前付きキーを使用する代わりに配列内に "年"を配置する方がずっと良いでしょう。名前付きキーは「anit-pattern」であり、計算に頼らずにMongoDBが「動的に」照会することはできません。一貫性のあるパスを維持することが最善の方法です。さらに、データを「索引付け」することもできます。あなたは鍵でそれをすることはできません。 –

答えて

0

を助け場合、私は昨年と呼ばれる別の分野での最新の年を持っているコレクション全体のすなわち

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

のためにそれを行うしたいと思います。

{ 
    "_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" 
    ] 
    } 
} 
関連する問題