As a preface, I've been working with MongoDB for about a week now, so this may turn out to be a pretty simple answer.
I have data already stored in my collection, we will call this collection content
, as it contains articles, news, etc. Each of these articles
contains another array called author
which has all of the author's information (Address, Phone, Title, etc).
The Goal - I am trying to create a query that will update the author's address on every article that the specific author exists in, and only the specified author block (not others that exist within the array).
Sort of a "Global Update" to a specific article that affects his/her information on every piece of content that exists.
Here is an example of what the content
with the author
looks like.
{
"_id" : ObjectId("4c1a5a948ead0e4d09010000"),
"authors" : [
{
"user_id" : null,
"slug" : "joe-somebody",
"display_name" : "Joe Somebody",
"display_title" : "Contributing Writer",
"display_company_name" : null,
"email" : null,
"phone" : null,
"fax" : null,
"address" : null,
"address2" : null,
"city" : null,
"state" : null,
"zip" : null,
"country" : null,
"image" : null,
"url" : null,
"blurb" : null
},
{
"user_id" : null,
"slug" : "jane-somebody",
"display_name" : "Jane Somebody",
"display_title" : "Editor",
"display_company_name" : null,
"email" : null,
"phone" : null,
"fax" : null,
"address" : null,
"address2" : null,
"city" : null,
"state" : null,
"zip" : null,
"country" : null,
"image" : null,
"url" : null,
"blurb" : null
},
],
"tags" : [
"tag1",
"tag2",
"tag3"
],
"title" : "Title of the Article"
}
I can find every article that this author has created by running the following command:
db.content.find({authors: {$elemMatch: {slug: 'joe-somebody'}}});
So theoretically I should be able to update the authors
record for the slug joe-somebody
but not jane-somebody
(the 2nd author), I am just unsure exactly how you reach in and update every record for that author.
I thought I was on the right track, and here's what I've tried.
b.content.update(
{authors:
{$elemMatch:
{slug: 'joe-somebody'}
}
},
{$set:
{address: '1234 Avenue Rd.'}
},
false,
true
);
I just believe there's something I am missing in the $set statement to specify the correct author and point inside of the correct array. Any ideas?
**Update**
I've also tried this now:
b.content.update(
{authors:
{$elemMatch:
{slug: 'joe-somebody'}
}
},
{$set:
{'authors.$.address': '1234 Avenue Rd.'}
},
false,
true
);
This is what finally worked for me!
db.content.update({'authors.slug':'joe-somebody'},{$set:{'authors.$.address':'Address That I wanted'}},false,true);
It updates all the records properly, thanks!
Maybe you can use the $ operator (positional-operator)?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With