В качестве предисловия я работаю с MongoDB уже около недели, поэтому это может оказаться довольно простым ответом.
У меня уже есть данные, хранящиеся в моей коллекции, мы назовемэта коллекция content
, так как она содержит статьи, новости и т. д. Каждый из них articles
содержит еще один массив с именем author
, в котором содержится вся информация об авторе (адрес, телефон, должность и т. д.).
Цель - Я пытаюсь создать запрос, который будет обновлять адрес автора в каждой статье, в которой существует конкретный автор, и только указанный блок автора (не других, которые существуют вмассив).
В некотором роде «Глобальное обновление» для конкретной статьи, которое влияет на его / ее информацию о каждом фрагменте контента, который существует.
Вот пример того, как выглядит content
с author
.
{
"_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"
}
Я могу найти каждую статью, созданную этим автором, выполнив следующую команду:
db.content.find({authors: {$elemMatch: {slug: 'joe-somebody'}}});
Так что теоретически я должен быть в состоянии обновить запись authors
для пули joe-somebody
, но не jane-somebody
(2-й автор), я просто не уверен, как именно вы достигаете и обновляете каждыйзапись для этого автора.
Я думал, что я на правильном пути, и вот что я попробовал.
b.content.update(
{authors:
{$elemMatch:
{slug: 'joe-somebody'}
}
},
{$set:
{address: '1234 Avenue Rd.'}
},
false,
true
);
Я просто считаю, что что-то мне не хватает в выражении $ setуказать правильного автора и указать внутри правильного массива.Любые идеи?
**Update**
Я также попробовал это сейчас:
b.content.update(
{authors:
{$elemMatch:
{slug: 'joe-somebody'}
}
},
{$set:
{'authors.$.address': '1234 Avenue Rd.'}
},
false,
true
);
Решение:
Это то, что, наконец, сработало для меня!
db.content.update({'authors.slug':'joe-somebody'},{$set:{'authors.$.address':'Address That I wanted'}},false,true);
Обновляет все записи правильно, спасибо!