2014-01-25 3 views
-1

Я пытаюсь выяснить, как обновить элемент внутри массива, который является частью сообщения. Я нашел это, которое ближе всего к тому, что я ищу: MongoDB Update Array elementmongodb: обновить элемент массива внутри сообщения внутри коллекции

Но у меня нет специального сообщения, выстроенного первым, как показано на примере. Но мне нужно сначала найти конкретную запись, используя _id, а затем обновить элемент в массиве из приведенного сообщения.

Могу ли я сделать это с помощью одного запроса или мне нужно сначала найти элемент, а затем обновить его, как показывает пример в другом ответе?

В нижнем json, как я могу обновить первые сообщения комментариев: первый комментарий?

EDIT:

[{ 
    "_id": "52c06c86b78a091f26000001", 
    "comments": [ 
     { 
      "user_id": "52ad97bab142627664000001 ", 
      "username": "phacer", 
      "comment": "nice dress!!!", 
      "created": 1390668491909, 
      "_id": "_SvF-Ag4d6wFf9QR1KdAdFIpcCyI3cqm2F4rl3w7rdk=" 
     }, 
     { 
      "user_id": "52ad97bab142627664000001 ", 
      "username": "phacer", 
      "comment": "nice dress!!!", 
      "created": 1390668491909, 
      "_id": "_SvF-Ag4d6wFf9QR1KdAdFIpcCyI3cqm2F4rl3w7rdk=" 
     } 
    ], 
    "desc": "Something somethingson", 
    "hate": [], 
    "imageurl": "some url", 
    "love": [ 
     { 
      "user_id": "52add4f4344e8ca867000001", 
      "username": "asd", 
      "created": 1390652212592 
     } 
    ], 
    "tags": [ 
     { 
      "y": 29.3, 
      "brand": "Zara", 
      "type": "Bow Tie", 
      "x": 20, 
      "color": "Black" 
     } 
    ], 
    "user_id": "52add4f4344e8ca867000001" 
}, 
{ 
    "_id": "52c06c86b78a091f26000001", 
    "comments": [ 
     { 
      "user_id": "52ad97bab142627664000001 ", 
      "username": "phacer", 
      "comment": "nice dress!!!", 
      "created": 1390668491909, 
      "_id": "_SvF-Ag4d6wFf9QR1KdAdFIpcCyI3cqm2F4rl3w7rdk=" 
     } 
    ], 
    "desc": "Something somethingson", 
    "hate": [], 
    "imageurl": "some url", 
    "love": [ 
     { 
      "user_id": "52add4f4344e8ca867000001", 
      "username": "asd", 
      "created": 1390652212592 
     } 
    ], 
    "tags": [ 
     { 
      "y": 29.3, 
      "brand": "Zara", 
      "type": "Bow Tie", 
      "x": 20, 
      "color": "Black" 
     } 
    ], 
    "user_id": "52add4f4344e8ca867000001" 
}] 
+0

Вы должны иметь возможность обновлять массив на основе запроса в одном окне рацион. Почему бы вам не разместить какой-нибудь образец json и объяснить, что вы хотите сделать, и мы можем отправить вам пример. – cirrus

+0

@cirrus Я добавил немного json, спасибо. –

+0

+1 для $ elemMatch - но у меня возникло бы желание просто поместить комментарии в свою коллекцию, если бы у меня был выбор. Таким образом, я мог бы использовать индекс для user_id, _id и post_id. Легко и быстро добавлять и обновлять. Удаление сообщения, и все комментарии будут более активными, но это менее распространенная операция, которую я подозреваю. – cirrus

ответ

2

Вы должны рассмотреть возможность использования $elemMatch (Documentation), как это:

.update({'_id': '52c06c86b78a091f26000001', 'comments' : {$elemMatch: {'_id': '_SvF-Ag4d6wFf9QR1KdAdFIpcCyI3cqm2F4rl3w7rdk='}}}, {$set : {'comments.$.comment': 'Lame dress!'}}) 
0

Вы можете использовать позиционные операторы в Монго, чтобы получить доступ к конкретному элементу массива, как показано ниже

db.collection.update({ _id: 52c06c86b78a091f26000001 }, { $set: { "comments.$1.comment" : "dress" } }) 
+0

Спасибо, это отлично выглядит. Что делать, если я не знаю, какие из комментариев я обновляю. Если бы я нашел его с помощью _id, например? –

Смежные вопросы