2017-12-03 8 views
0

サブ文書があるコレクションがあり、正確な文書を取得する簡単な方法を見つけようとしています。私がやりたいものをサブ文書を文書から取得する

{ 
    "_id" : ObjectId("59b0303bfe409a21fccc9523"), 
    "CreatedOn" : ISODate("2017-07-22T15:55:00.000+0000"), 
    "UpdatedOn" : ISODate("2017-07-22T15:55:00.000+0000"), 
    "Guid" : "4F1D7541-FF27-4FEF-9BC4-CF27D2CB92BA", 
    "Company" : "Demo Co.", 
    "Departments" : [ 
     { 
      "CreatedOn" : ISODate("2017-07-22T15:55:00.000+0000"), 
      "UpdatedOn" : ISODate("2017-07-22T15:55:00.000+0000"), 
      "Guid" : "D5950FC8-91B1-48A3-8B6A-F3A72FAC9175", 
      "Title" : "Execute" 
     } 
    ] 
} 

は、そのGUIDに基づいて、特定の部門を取得しているが、これまでのところ、私は私が望むだけの文書を取得するクリーンである何かを見つけていませんよ。

私はこのような結果を取得したいと思います:私はMongoDBのドキュメントを中心に見てきたが、何もこれまで作業していない、私は取得しています最も近いarray_search使用しているが、私

{ 
    "CreatedOn" : ISODate("2017-07-22T15:55:00.000+0000"), 
    "UpdatedOn" : ISODate("2017-07-22T15:55:00.000+0000"), 
    "Guid" : "D5950FC8-91B1-48A3-8B6A-F3A72FAC9175", 
    "Title" : "Execute" 
} 

を可能であれば、PHPでハッキングするのを避けるために、mongo自体から直接取り出したいと思っています。

+0

は、私はそれを試してみました、それは動作しません – Eman

答えて

0
このような

おそらく何か: db.collection.find({ "Departments.Guid": "some_value" }) https://docs.mongodb.com/manual/tutorial/query-embedded-documents/

+0

より良い私のポイントを反映するために、私の質問を更新し、子ドキュメントのすべての親ドキュメントを返すだけです。子ドキュメントのいずれかが必要です。 – Eman

+0

'db.collection.find({" Departments.Guid ":" some_value "}).toArray()['Departments'] 'どのように これについて ? 'find'の結果が' cursor'なので、少しのロジックを追加する必要があります。 – DrNio

+0

PHPハックが最適なオプションのようです。 – Eman

0

GUIDはDepartments配列のsubdocサブに固有のものである(GUIDを探している、すなわち、親ドキュメント内の唯一の可能な一致が得られ)が、GUIDがあるかもしれないと仮定すると、他の親ドキュメント間で同じであれば、これはあなたが求める出力結果を生成します。 GUIDがすべての配列と親ドキュメントで一意であれば、これもうまくいきます。

基本的には、Departments.Guid = target GUID(以下「myGUID」)をフィルタリングします。これにより、0または1要素の配列が残っており、そこから$arrayElemAtでサブディレクトリを抽出し、そのドキュメントをルートドックとして「持ち上げ」ます(名前付きフィールドにドキュメントを割り当てるのではなく)。サブドックが一致しない場合(配列ポストフィルタの長さが0の場合)、$arrayElemAtはnullを返し、qqは存在しません。実際に存在するフィールドがルートに入る必要がある$replaceRootを呼び出す前に、これらのドキュメントを削除したいと考えています。

db.foo.aggregate([ 
    {$project: { qq: {$arrayElemAt: [ 
         { $filter: { 
          input: "$Departments", 
          as: "zz", 
          cond: {$eq: [ "$$zz.Guid", "myGUID" ]} 
          }} 
         , 0] } }} 
    ,{$match: { qq: {$exists: true}} } 
    ,{$replaceRoot: { newRoot: "$qq"} } 
       ]); 
0

あなたはこれだけ返されます

db.foo.find({"_id" : ObjectId("59b0303bfe409a21fccc9523")}) 
.map(function(u){ 
     return u.Departments 
       .filter(p => p.Guid == "D5950FC8-91B1-48A3-8B6A-F3A72FAC9175") 
    } 
) 

、これを試してみることができます:

[ 
    [ 
     { 
      "CreatedOn" : ISODate("2017-07-22T21:25:00.000+05:30"), 
      "UpdatedOn" : ISODate("2017-07-22T21:25:00.000+05:30"), 
      "Guid" : "D5950FC8-91B1-48A3-8B6A-F3A72FAC9175", 
      "Title" : "Execute" 
     } 
    ] 
] 
+0

の解決策ではありません。 OPは_idではなくGUIDに基づいてルックアップしようとしています。述語をfind()に完全にドロップすると、javascriptドライバのmap()関数はサーバー側ではなくクライアント側であり、コレクション内のすべてのレコードをワイヤにドラッグして関数を実行します。バイトをたくさん使用し、インデックスを使用することはできません(望ましいものになるはずです)。 –

+0

の場合、findメソッドをこのdb.foo.find({"Departments.Guid": "" D5950FC8-91B1-48A3-8B6A-F3A72FAC9175 "}}と置き換えることができます) –

関連する問題