В качестве предисловия я работаю с 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
для slug joe-somebody
, но не jane-somebody
(второй автор), я просто не уверен точно, как вы достигаете и обновляете каждую запись для этого автора.
Я думал, что я на правильном пути, и вот что я пробовал.
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);
Он обновляет все записи правильно, спасибо!