MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да внедря тази операция за заявка и актуализиране на mongodb (CSharp драйвер)?

Ако по същество разбирам същината ви, вие всъщност искате

  1. Изтеглете елемента, който не е задължителен, от вашия масив с препратки
  2. Задайте стойността на полето за основна справка на първия елемент от променения масив

И направете това с една актуализация, без да премествате документи по кабела.

Но това за съжаление не може да се направи. Основният проблем с това е, че няма начин да се препрати към стойността на друго поле в документа, който се актуализира. Въпреки това, за да направите това без итерация, ще трябва също да получите достъп до променено масив, за да получите новия първи елемент.

Може би един подход е да преосмислите вашата схема, за да постигнете това, което искате. Моят вариант тук е да разширя малко вашите референтни документи и да премахна нуждата от полето за основна справка.

Изглежда, че предположението, с което сте готови да живеете при актуализациите, е, че ако премахнатата препратка е била основната препратка, тогава можете просто да зададете новата основна препратка към първия елемент в масива. Имайки това предвид, разгледайте следната структура:

refs: [ { oid: "object1" }, { oid: "object2" }, { oid: "object5", main: true } ]

Като ги промените на документи с oid свойство, което ще бъде зададено на ObjectId, дава възможност да има допълнително свойство в документа, което указва кое е по подразбиране. Това може лесно да бъде заявено, за да се определи кой идентификатор е основната препратка.

Сега също помислете какво би се случило, ако документът, съответстващ на „object5“ в полето oid, бъде изтеглен от масива:

refs: [ { oid: "object1" }, { oid: "object2" } ]

Така че, когато питате кой е main-reference според по-ранната логика приемате първия документ в масива. Сега, разбира се, според изискванията на вашето приложение, ако искате да зададете различен main-reference просто променяте документа

refs: [ { oid: "object1" }, { oid: "object2", main: true } ]

И сега остава логиката да се избере елементът от масива, който има основното свойство като true, ще се появи в предпочитанието и както е показано по-горе, че ако това свойство не съществува в документ с елементи, тогава се върнете към първия елемент.

С всичко това усвоено, вашата операция за извличане на всички препратки към обект от този масив във всички документи става доста проста, както се прави в обвивката (същият формат трябва да се прилага основно за всеки драйвер):

db.books.update(
   { "refs.oid": "object5" },
   { $pull: { refs: {oid: "object5"} } }, false, true )

Двата допълнителни аргумента към заявката и операцията за актуализиране са upsert и multi съответно. В този случай, upsert няма много смисъл, тъй като искаме да модифицираме само съществуващи документи и multi означава, че искаме да актуализираме всичко, което съответства. По подразбиране се променя само първият документ.

Естествено съкратих цялата нотация, но разбира се стойностите могат да бъдат действителни ObjectId според вашето намерение. Също така изглеждаше разумно да се предположи, че основното ви използване на main-reference е след като сте изтеглили документа. Дефиниране на заявка, която връща main-reference като следвам логиката, която беше очертана, би трябвало да е възможно, но както е сега, написах много тук и трябва да прекъсна за вечеря :)

Мисля, че това представлява полезен случай за преосмисляне на вашата схема, за да избегнете прекомерни итерации за това, което искате да постигнете.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да получите целия брой на модела мангуста?

  2. Конвертирайте .NET Guid в MongoDB ObjectID

  3. импортиране на CSV файл MongoDB с ISODate

  4. Как да архивирате и възстановите ClusterControl

  5. MongoDB $isoDayOfWeek