2012-10-12 2 views
0

Мне нужно обновить код C# с помощью MongoDB. Здесь я должен был реализовать 2-й массив уровня обновления в ниже (subBranchindex берется в общем списке объектах): -Mongo DB C# код с использованием уровня 2 уровня, уровня 3 и 4 уровня

for (var index = 0; index < subBranchindex.Count; index++) 
{ 
    if (subBranchindex[index]._id == new ObjectId(subBranchid)) 
    { 
     IMongoQuery queryEdit = Query.EQ("BranchOffice.SubBranchlist._id", new ObjectId(subBranchid)); 
     UpdateBuilder update = Update.Set("BranchOffice.$.SubBranchlist."+ index +".Name",subBranch.SubName). 
     SafeModeResult s = dc.Collection.Update(queryEdit, update, 
     UpdateFlags.None, SafeMode.True); 
    } 
} 

массива Здесь второго уровня, я использую (для оператора цикла) для принятого значения индекса для массива. Далее я могу использовать 3-й, 4-й и 5-й уровни массива, которые будут назначаться больше, чем (для оператора цикла). Поэтому не нужно [for loop Statement], а также не нужно назначать хардкор-номер в индексе. For example: ("BranchOffice.$.SubBranchlist.0.Name",subBranch.SubName). Здесь Do not Hardcore number [index] 0 или 1 или 2. «2-й» уровень массива содержит более 100 записей.

Можно ли использовать значение индекса массива? Пожалуйста, объясните, как решить эту проблему. Пожалуйста, объясните мне пример.

+1

Возможно, вы захотите попробовать вернуться к ответам, которые люди дают вам, или люди могут не потрудиться внести свой вклад в будущем. Похоже, вы все еще решаете связанные с этим проблемы: http://stackoverflow.com/questions/12720655/update-in-a-nested-array-using-c-sharp-driver-in-mongodb – cirrus

ответ

0

Основываясь на вашем примере выше, мое понимание вашей схемы заключается в следующем:

  • документ верхнего уровня имеет BranchOffice поле
  • BranchOffice является массивом объектов
  • Каждый объект в BranchOffice имеет _id, SubName и SubBranchlist Поле
  • SubBranchlist - это массив объектов
  • Каждого объект в SubBranchlist имеет Name поле

Ваше заявление обновление представляется, копирование SubName поля для каждого Name поля между объектами в пределах SubBranchlist (родной брат поле из SubName).

Использование синтаксиса пути свойства для выбора полей через массивы (например, SubBranchlist.0.Name), нет индекса подстановочных знаков, который позволит вам изменять поля Name среди всех объектов в массиве.

В некотором отношении примечание $ positional operator применимо только к элементу с первым согласованным массивом, поэтому вы не можете использовать его для обновления нескольких элементов массива. В вашем случае это не было бы вариантом, так как вы используете оператор позиционирования для поля массива BranchOffice.

Вы можете либо выпустить серию запросов на обновление (для каждого элемента в SubBranchlist), либо рассмотреть возможность использования $set для изменения всего массива SubBranchlist в одном запросе. Недостатком с использованием $set является то, что вам нужно будет прочитать и записать весь массив, что может быть проблемой, если другие параллельные операции также выдают обновления массиву.

+0

Спасибо за помощь вы, но документ верхнего уровня имеет поле для путешествий. документ следующего уровня [документ верхнего уровня в одном поле массива] имеет Branchoffice. извините за то, что я не упоминал, что документы на высшем уровне - это туристический агент. – Balaji

+0

В этом случае функция 'Update.Set()' может быть неправильной; однако мои пункты выше все еще применяются в отношении ваших ограничений с '$' и числовыми позициями в путях полей. – jmikola

Смежные вопросы