2014-12-21 3 views
0

Я хочу, чтобы обновить значение массива, который вложен в пределах значения массива: тоестьКак обновить значение вложенного массива в mongodb?

status = enabled

где alerts.id = 2

{ 
    "_id" : ObjectId("5496a8ed49847b6cd7c7b350"), 
    "name" : "joe", 
    "locations" : [ 
     { 
      "name": "my location", 
      "alerts" : [ 
       { 
        "id" : 1, 
        "status" : null 
       }, 
       { 
        "id" : 2, 
        "status" : null 
       } 
      ] 
     } 
    ] 
} 

я использовал бы характер позиции $, но не может использовать его в два раза в заявлении - многопозиционные операторы еще не поддерживаются: https://jira.mongodb.org/browse/SERVER-831

Как подать заявление t o обновлять только поле статуса оповещения, соответствующее идентификатору 2?

UPDATE

Если изменить схему следующим образом:

{ 
    "_id" : ObjectId("5496ab2149847b6cd7c7b352"), 
    "name" : "joe", 
    "locations" : { 
     "my location" : { 
      "alerts" : [ 
       { 
        "id" : 1, 
        "status" : "enabled" 
       }, 
       { 
        "id" : 2, 
        "status" : "enabled" 
       } 
      ] 
     }, 
     "my other location" : { 
      "alerts" : [ 
       { 
        "id" : 3, 
        "status" : null 
       }, 
       { 
        "id" : 4, 
        "status" : null 
       } 
      ] 
     } 
    } 
} 

можно затем использовать:

update({"locations.my location.alerts.id":1},{$set: {"locations.my location.alerts.$.status": "enabled"}}); 

Проблема, я не могу создавать индексы предупредительного ID: - (

+1

Возможно, вам захочется пересмотреть вашу модель данных, если это возможно. Вложенные массивы вроде этого сложны для работы в MongoDB. – Tommi

+0

Спасибо за ответ Tommi, кажется, многопозиционные операторы https://jira.mongodb.org/browse/SERVER-831 – Chev

ответ

-1

Я думаю, что вы ошибаетесь инструмент для работы. В вашем примере у вас есть реляционные данные, и с реляционной базой их гораздо проще обрабатывать. Поэтому я бы предложил использовать SQL-базу данных вместо mongo.

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

+0

Спасибо Hequ, но не могу согласиться с этим предложением. – Chev

1

может быть лучше моделироваться как таковой, особенно если необходим указатель на месте и/или alerts.id.

{ 
    "_id" : ObjectId("5496a8ed49847b6cd7c7b350"), 
    "name" : "joe", 
    "location" : "myLocation", 
    "alerts" : [{ 
        "id" : 1, 
        "status" : null 
       }, 
       { 
        "id" : 2, 
        "status" : null 
       } 
      ] 
} 




{ 
    "_id" : ObjectId("5496a8ed49847b6cd7c7b350"), 
    "name" : "joe", 
    "location" : "otherLocation", 
    "alerts" : [{ 
        "id" : 1, 
        "status" : null 
       }, 
       { 
        "id" : 2, 
        "status" : null 
       } 
      ] 
} 
Смежные вопросы