2017-05-20 20 views
-1

私は、アレイ内の各「名前が」「カラーに対して1~1図として示されている場合、以下のように結果のセットを取得したいMongoのデータベース各mongodbレコードの配列のフィールドを照会して表示する方法は?

{ 
    "_id": "100", 
    "Color": "Green", 
    "data":[{"Name":"John"}] 
} 
{ 
    "_id": "101", 
    "Color": "Green", 
    "data":[{"Name":"Andy"}] 
} 
{ 
    "_id": "102", 
    "Color": "Blue", 
    "data":[{"Name":"Paul"}] 
} 
{ 
    "_id": "103", 
    "Color": "Blue", 
    "data":[{"Name":"Jimi"}] 
} 
{ 
    "_id": "104", 
    "Color": "Blue", 
    "data":[{"Name":"Lucy"}] 
} 
{ 
    "_id": "105", 
    "Color": "Red", 
    "data":[{"Name":"Aron"}] 
} 

に以下のデータを有しますフィールド。

{ 
    "Color": "Green", "Name": John 
    "Color": "Green", "Name": Andy 
    "Color": "Blue", "Name": Paul 
    "Color": "Blue", "Name": Jimi 
    "Color": "Blue", "Name": Lucy 
    "Color": "Red", "Name": Aron 
} 

私はグループに関するドキュメントを読みますが、上記のような形式で結果を取得するクエリを作成する方法を確認していませんか?あなたはここで、その後

db.getCollection('test').aggregate([ 
{ 
    $project: {_id: 0, Color: 1, Name: "$data.Name"} //_id field is included by default and we need to supress it 
}, 
{ 
    $unwind: "$Name" //without this the Name will be embedded 
}, 
{ 
    $sort: { 
     "Color": 1 
    } 
}]) 

をこのクエリを実行したい

+1

、更新されたコードです。 1 - 重複したID - 許可されていない重複した_idを持っています 2 - 無効なJSON - あなたのデータフィールドは無効です。 [{Name:Aron}]のような配列obオブジェクト、または{Name:Aron}のようなプロパティを持つオブジェクトを言うことを意味しますか?まずはこの問題を解決してください。 –

+0

@SamipSuwal私はColorフィールドを導入してデータ構造を修正しました。このフィールドは "_id"の代わりに表示されます。それは確かにオブジェクトの配列であり、修正されたフォーマットです。 – user3190153

答えて

0

[OK]を、我々は最初の$プロジェクトと色と名前だけで、文書に沿って通過します。

名前はデータ配列の内部にあるのでオブジェクト内に埋め込まれていますので、$ unwindを使用して分解します。それはトップレベルのプロパティになります。 データに複数のアイテムが含まれていると、すべてのアイテムが「巻き戻される」ことに注意してください。

最後に、$ sortを使用して、色に従ってデータを並べ替えます。

これは役に立ちますか?ニールLUNNさんのコメント

更新我々は唯一の配列の1つの要素を持っているので、ニールは、指摘したように。 $arrayElemAtを使用することができ、$ unwindパイプラインステージを持つ必要はありません。ここで

は、あなたが与えたスキーマの例では間違ったことがいくつかあります

db.getCollection('test').aggregate([ 
{ 
    $project: {_id: 0, Color: 1, Name: {$arrayElemAt: ["$data.Name", 0]}} //_id field is included by default and we need to supress it 
}, 
{ 
    $sort: { 
     "Color": 1 
    } 
}]) 
+1

すべての配列項目には1つのみがあることを考慮して、 '$ unwind'ステージを含める代わりに[' $ arrayElemAt'](https://docs.mongodb.com/manual/reference/operator/aggregation/arrayElemAt/)はどうでしょうか?素子。 –

+0

配列に1つの要素しかないことが保証されている場合は、$ arrayElemAtを使用することができます。 $ unwindを使用する必要があります。コメントしてくれてありがとう。 –

+0

ありがとう、これは完璧です!私が行った変更の1つは、NameをResultofNameに変更しました。これは元の列と区別されます – user3190153

関連する問題