2016-11-28 3 views
1

にネスト:MongoDBは私はこのようなスキームのコレクションを持って削除クエリ

[ 
    Folder: { 
     _id: ObjectId(...), 
     Item: [{ 
      _id: ObjectId(...), 
      Version: [{ 
       _id: ObjectId(...), 
       ConfirmedDevices: [ObjectId(...), ...] 
      }, ...] 
     }, ...] 
    } 
] 

私は特定のFolder内のすべてのアイテムのすべてのバージョンのConfirmedDevices配列からいくつかの特定のIDを削除する必要があります。言い換えれば、私はフォルダを選択する必要があるfolderIdを持っています。次に、そのフォルダ内に存在するすべての確認済みデバイスからが削除されている必要があるIDのリストをから削除しました。

私はこれをC#ドライバよりも行う必要があります。実際に私はすでにこれを行うコードを書いていますが、それはフォルダ内の各項目の各バージョンごとにdbに問い合わせる必要があります。そして、これはフォルダ上の多くのアイテムの場合にパフォーマンスの問題を引き起こします。

私が言っていることの論理は、これを疑似コードとして取ることです。

for (int i = 0; i < folder.items.Count; i++) 
{ 
    for (int j = 0; j < item.versions.Count; j++) 
    { 
     db.folders.update(
      {"_id": ObjectId("...") }, 
      { $pull: { "Items." + i + ".Versions." + j + ".ConfirmedDevices": { $in: [ ObjectId("...") ] } } }, 
      { multi: true } 
     ); 
    } 
} 

私はmongodbのネストされたクエリが暗いとコンセプトの貧弱な側にあることを知っています。しかし、私はこれが不可能であることを確認することはできません。

私はこれを一度に行うことができますか? (普通のmongodbクエリで十分ですが、C#版に変換できます)

答えて

0

私は$ elemMatchがあなたの欠けているものだと思います。これにより、埋め込みドキュメントのフィールドを使用してアイテムを識別できます。で$と$はあなたが

MongoDB Documentation - ElemMatch

+0

欲しいものを達成することができるようになります引っ張ると組み合わせて、このあなたが手の込んだことができますどのような方法がありますか?たぶん事例を起こす? –

関連する問題