2016-11-28 2 views
1

У меня есть коллекция с схемой, как это:MongoDb вложенный удалить запрос

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

Мне нужно удалить некоторые определенные идентификаторы из ConfirmedDevices массива каждой версии каждого элемента в определенном Folder. Другими словами, у меня есть папка, для которой мне нужно выбрать папку. Затем у меня есть список 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

Есть ли способ, вы можете уточнить? Может быть, запустите пример? –