Skip to main content

UPDATING ARRAYS IN MONGODB DOCUMENTS

MongoDB is such a great database program that once you use it, it is hard going back. One pain in the backside though that I’ve always experienced is updating arrays inside mongoDB documents. For some reason or the other this is something that always bothered me.
So, for all the people like me who are sailing in the same boat maybe these examples and code snippets will help you (and me in the future) to update array elements properly in mongo.

Updating matched array elements

Assume that there is mongoDB collection called cards where each document has a field called attacks. This attacks field is an array of objects that contains the various attacks that the card can do and their attackPoints. Something along the lines of :-
1
2
3
4
5
6
7
8
9
10
11
{
attacks: [{
    attack: "Fireball",
    attackPoints: 45
  },
  {
    attack: "Fire Blast",
    attackPoints: 60
  }
  ]
}
Suppose we want to change the Fireball attack to have attackPoints as 40 for all the cards that have this Fireball attack. The query that we would write for this is :-
1
db.cards.updateMany({attacks: {$elemMatch : { attack: "Fireball", attackPoints: 45}}}, {$set: {"hobbies.$": {attack: "Fireball", attackPoints: 40}}});
Some points to keep note of here is that if we had used just “hobbies” inside the $set function we would have replaced the entire attacks array with this object. It is the $ after the “hobbies.” that makes mongo realise that only the matching element need to be updated.

Updating all array elements

Another thing you might want to do is updating a single field of all the elements in the array. Let us assume we want to increase the attackPoints field by 5 for every attack of every card.
1
db.cards.updateMany({}, {$inc : { "attacks.$[].attackPoints": 5 }});
Another new thing here is the $[] , what this notation tells mongo to do is to update all the elements in the array.

Adding and removing elements

Let us see how to push a single element and multiple elements into a document array :-
1
2
3
4
5
//Single Element
db.cards.updateMany({},{$push: {attacks: {attack: "Ice Beam", attackPoints: 20}}});
 
//Multiple Elements
db.cards.updateMany({},{$push: {attacks: {$each : [{attack: "Earthquake", attackPoints: 30},{attack: "Zap", attackPoints: "44"}]}}});
The $push identifier pushes the elements onto the arrays while the $each identifier loops over the elements and does some operation on each of them (here, pushing them onto the array).

Removing elements from an array

The final thing with array updation is removing elements from the arrays. We can do that in two different ways – one using the $pull identifier and the other using the $pop identifier.
The different between these two is that the $pull method allows you to give filters to search for and remove elements while the $pop identifier will remove only the first or the last element of the array.
1
2
3
4
5
// Using pop
db.cards.updateMany({},{$pop: {attacks: 1}});
 
// Using pull
db.cards.updateMany({},{$pull : {attacks: { attack: "Zap" }}});
Note that the $pop can take in either 1 or -1 as the value after you mention the array. 1 is for the last element and -1 is to remove the first element.

Comments

Popular posts from this blog

How to use Ngx-Charts in Angular ?

Charts helps us to visualize large amount of data in an easy to understand and interactive way. This helps businesses to grow more by taking important decisions from the data. For example, e-commerce can have charts or reports for product sales, with various categories like product type, year, etc. In angular, we have various charting libraries to create charts.  Ngx-charts  is one of them. Check out the list of  best angular chart libraries .  In this article, we will see data visualization with ngx-charts and how to use ngx-charts in angular application ? We will see, How to install ngx-charts in angular ? Create a vertical bar chart Create a pie chart, advanced pie chart and pie chart grid Introduction ngx-charts  is an open-source and declarative charting framework for angular2+. It is maintained by  Swimlane . It is using Angular to render and animate the SVG elements with all of its binding and speed goodness and uses d3 for the excellent math functio...

Understand Angular’s forRoot and forChild

  forRoot   /   forChild   is a pattern for singleton services that most of us know from routing. Routing is actually the main use case for it and as it is not commonly used outside of it, I wouldn’t be surprised if most Angular developers haven’t given it a second thought. However, as the official Angular documentation puts it: “Understanding how  forRoot()  works to make sure a service is a singleton will inform your development at a deeper level.” So let’s go. Providers & Injectors Angular comes with a dependency injection (DI) mechanism. When a component depends on a service, you don’t manually create an instance of the service. You  inject  the service and the dependency injection system takes care of providing an instance. import { Component, OnInit } from '@angular/core'; import { TestService } from 'src/app/services/test.service'; @Component({ selector: 'app-test', templateUrl: './test.component.html', styleUrls: ['./test.compon...

How to solve Puppeteer TimeoutError: Navigation timeout of 30000 ms exceeded

During the automation of multiple tasks on my job and personal projects, i decided to move on  Puppeteer  instead of the old school PhantomJS. One of the most usual problems with pages that contain a lot of content, because of the ads, images etc. is the load time, an exception is thrown (specifically the TimeoutError) after a page takes more than 30000ms (30 seconds) to load totally. To solve this problem, you will have 2 options, either to increase this timeout in the configuration or remove it at all. Personally, i prefer to remove the limit as i know that the pages that i work with will end up loading someday. In this article, i'll explain you briefly 2 ways to bypass this limitation. A. Globally on the tab The option that i prefer, as i browse multiple pages in the same tab, is to remove the timeout limit on the tab that i use to browse. For example, to remove the limit you should add: await page . setDefaultNavigationTimeout ( 0 ) ;  COPY SNIPPET The setDefaultNav...