sql >> Database >  >> NoSQL >> MongoDB

Hoe implementeer ik deze mongodb-query &update-bewerking (CSharp-stuurprogramma)?

Als ik je in wezen begrijp, wil je eigenlijk

  1. Trek het item dat niet vereist is uit uw referentiearray
  2. Stel de waarde van uw hoofdreferentieveld in op het eerste element van de gewijzigde array

En krijg dat allemaal in één update gedaan zonder documenten over de draad te verplaatsen.

Maar dit kan helaas niet. Het grootste probleem hiermee is dat er geen manier is om te verwijzen naar de waarde van een ander veld in het document dat wordt bijgewerkt. Om dit te doen zonder te herhalen, moet u echter ook toegang hebben tot de gewijzigde array om het nieuwe eerste element te krijgen.

Misschien is een benadering om uw schema opnieuw te bekijken om te bereiken wat u wilt. Mijn optie hier zou zijn om uw referentiedocumenten een beetje uit te breiden en de noodzaak voor het hoofdreferentieveld te verwijderen.

Het lijkt erop dat de veronderstelling waarmee u bereid bent te leven met de updates is dat als de verwijderde verwijzing de hoofdverwijzing was, u de nieuwe hoofdverwijzing gewoon kunt instellen op het eerste element in de array. Overweeg met dat in gedachten de volgende structuur:

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

Door deze te wijzigen in documenten met een oid eigenschap die zou worden ingesteld op de ObjectId, geeft het de optie om een ​​extra eigenschap op het document te hebben die aangeeft wat de standaard is. Dit kan eenvoudig worden opgevraagd om te bepalen welke Id de belangrijkste referentie is.

Bedenk nu ook wat er zou gebeuren als het document dat overeenkomt met "object5" in het oid-veld uit de array zou worden gehaald:

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

Dus wanneer u vraagt ​​waarvoor de main-reference volgens de eerdere logica accepteert u het eerste document in de array. Nu natuurlijk, naar uw toepassingsvereisten, als u een andere main-reference wilt instellen je wijzigt gewoon het document

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

En nu blijft de logica over om het array-element met de hoofdeigenschap te kiezen, aangezien waar bij voorkeur zou voorkomen, en zoals hierboven is aangetoond dat als die eigenschap niet bestaat in een elementdocument, dan terugvalt op het eerste element.

Als dat allemaal is verwerkt, wordt uw bewerking om alle verwijzingen naar een object uit die array in alle documenten te halen vrij eenvoudig, zoals gedaan in de shell (dezelfde indeling zou in principe van toepassing moeten zijn op elk stuurprogramma):

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

De twee extra argumenten voor de query- en update-bewerking zijn upsert en multi respectievelijk. In dit geval upsert heeft niet veel zin omdat we alleen bestaande documenten willen wijzigen, en multi betekent dat we alles willen updaten dat overeenkomt. De standaardinstelling is om alleen het eerste document te wijzigen.

Natuurlijk heb ik alle notaties ingekort, maar de waarden kunnen natuurlijk de werkelijke ObjectId's zijn volgens uw bedoeling. Het leek ook redelijk om aan te nemen dat uw belangrijkste gebruik van de main-reference is zodra u het document hebt opgehaald. Een query definiëren die de main-reference retourneert door de logica te volgen die werd geschetst zou mogelijk moeten zijn, maar zoals het er nu uitziet heb ik hier veel getypt en moet ik pauzeren voor het avondeten :)

Ik denk dat dit een goede zaak is om je schema te heroverwegen om te voorkomen dat je te veel herhalingen krijgt voor wat je wilt bereiken.




  1. Waarom MongoDB-configuratieservers slechts één of drie moeten zijn?

  2. Veldnamen van FieldPath mogen geen '.' bevatten. wanneer u AGGREGATE probeert te gebruiken

  3. MongoDB Tel het totale aantal echte en valse waarden voor documenten die overeenkomen met een zoekopdracht

  4. Laravel Jensseger Mongodb behoortToMany retourneert lege array