2017-09-18 35 views
0

を楽しみながらおくつろぎいただけ$を使用する:あなたが見ることができるように、私はノードを表し文書を持って私は次のような構造を持つコレクション持つネストされたサブ文書

{ 
    { 
    node: 'ST20' 
    Ds:{ 
      699:{ 
        TotCM: 300 
        Docsis20: 200 
        Docsis30: 100 
       } 
      705:{ 
        TotCM: 250 
        Docsis20: 150 
        Docsis30: 100 
       } 

     } 
    } 
    { 
    node: 'ST21' 
Ds:{ 
      651:{ 
        TotCM: 200 
        Docsis20: 100 
        Docsis30: 100 
       } 
      699:{ 
        TotCM: 100 
        Docsis20: 0 
        Docsis30: 100 
       } 

     } 
    } 
} 

を。各ノードは、異なるチャネルを有する。私の目的は、私が各チャンネルで持っているケーブルモデムの数を確認することです。私は各ノードにあるチャンネルを前もって知りません。

{ node: 'ST20', Ds: 699, TotCM: 300, Docsis20: 200, Docsis30:100 } 
{ node: 'ST20', Ds: 705, TotCM: 250, Docsis20: 150, Docsis30:100 } 
{ node: 'ST21', Ds: 651, TotCM: 200, Docsis20: 100, Docsis30:100 } 
{ node: 'ST21', Ds: 699, TotCM: 100, Docsis20: 0, Docsis30:100 } 

は、私は次のクエリを試してみました:だから私はこのような何かを持っていると思い

db.statsNodos.aggregate(
{ $project: {_id:0,Ds:1,node:1}}, 
{ $unwind: "$Ds"} 
).pretty() 

しかし、私は、元の文書を取得します。ご覧のとおり、これらはネストされたドキュメントであり、一連のドキュメントではありません。たぶん私は$unwindを使用する必要はありませんし、これを得る別の方法があります。教えて頂けますか?

+0

'' $ unwind''は配列に対してのみ動作します[''オペランドが配列には解決されないが、欠落、ヌル、または空の配列でない場合、$ unwindはオペランドを単一の要素配列として扱います。 '](https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/#non-array-field-path)あなたはあなたのjsonを修正する必要があります(実際にはjsonではないため)isnここに行く道はない。 – Skami

答えて

1

あなたの例の文書構造を考える:

{ node: 'ST21', 
    Ds: { 
     "651":{ TotCM: 200, Docsis20: 100, Docsis30: 100 }, 
     "699":{ TotCM: 100, Docsis20: 0, Docsis30: 100 } 
     } 
} 

あなたは価値にあなたのフィールドchannels名前を旋回するようにoperator $objectToArrayを利用することができます。たとえば:

{"$project": { 
       "_id": 0, 
       "node": 1, 
       "tmp": { "$objectToArray": "$Ds" } 
      } 
}, 
{"$unwind": "$tmp" }, 
{"$project": { 
       "node": 1, 
       "Ds": "$tmp.k", 
       "TotCM": "$tmp.v.TotCM", 
       "Docsis20": "$tmp.v.Docsis20", 
       "Docsis30": "$tmp.v.Docsis30" 
      } 
} 

私はまた、より簡単に照会するために、あなたのMongoDB Data Schemaを再考することをお勧めします。

+0

はい!それはうまくいった。どうもありがとうございました! – NGabioud

関連する問題