Обновление определенного ключа / значения внутри поля массива с помощью MongoDB - PullRequest
17 голосов
/ 17 июня 2010

В качестве предисловия я работаю с 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);

Обновляет все записи правильно, спасибо!

1 Ответ

6 голосов
/ 17 июня 2010

Может быть, вы можете использовать оператор $ ( позиционный оператор )?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...