2012-05-08 3 views
3

У нас есть некоторые встроенные документы, которые выглядят следующим образом:обновление одного поля в MongoDB в одном встроенном документе

{ 
"_id" : ObjectId("4e402353bc9f6ec5a6000001"), 
"first_name" : "Chris", 
"last_name" : "Jones", 

    "alerts" : [ 
    { 
     "_id" : ObjectId("4f7cd6ffc067db00070022d4"), 
     "name" : "Default", 
     "email_frequency" : "weekly", 
     "interested_industries" : [ 
      "Computer Software", 
      "Internet" 
     ], 
     "interested_employers" : [ 
      "Facebook", 
      "AOL" 
     ], 
     "interested_skills" : [ ], 
     "matches" : [ 
      ObjectId("4ee46a2a0dd0c70017000365"), 
      ObjectId("4efa1707bacfa40001012b65"), 
      ObjectId("4e402376bc9f6ec5a6000a7a"), 
      ObjectId("4e4e0eb8d052fc4028021f66"), 
      ObjectId("4ee55d8500ca410014000003"), 
      ObjectId("4ee63d06d96b850001008688"), 
      ObjectId("4e57be7ed052fc606a002335"), 
      ObjectId("4f05d47d9ce340001702ba42"), 
      ObjectId("4f200ffcaf5f34000e0021a4"), 
      ObjectId("4e4de701d052fc33da00052f") 
     ], 
     "updated_at" : ISODate("2012-05-03T18:26:14.774Z") 
    } 
] 
} 

Поскольку документ выше содержится в массиве, у меня возникают проблемы выбора его формы в селектор с чем-то вроде этого:

User.collection.update({"_id" => user.id}, {:$set => {"alert.matches" => matches}}) 

Но это обновит все совпадения #alerts. Я просто хочу обновить одно предупреждение с идентификатором «4fa7fd60e5be08bcc9000644».

+0

Лучше разместить точный json-документ. –

+0

Речь идет о реализации драйвера ruby, JSON не имеет отношения к делу. – user577808

+0

Ну, я не уверен, что я вижу здесь. Если люди не могут вам помочь, это становится актуальным :) –

ответ

5

Вы можете, вероятно, использовать positional operator идентифицировать элемент массива:

Позиционный оператор $

Оператор $ (сам по себе) означает «положение согласованного элемента массива в запросе ». Используйте это, чтобы найти член массива, а затем манипулировать им.

Так что, возможно, что-то вроде:

User.collection.update(
    { :_id => user.id, :matches => BSON::ObjectId('4e40238dbc9f6ec5a6000eed') }, 
    { :$set => { 'alert.matches.$' => matches } } 
) 

Но, как отмечает Серджио, трудно чесать структуру ваших документов на основе ограниченной информации в вашем вопросе.


Похоже больше информации пришел после того, как я ответил, и это выглядит следующим образом:

{ :$set => { 'alerts.$.matches' => ... } } 

является то, что вам нужно. И вам нужно будет включить :matches в запрос, так что $ есть что обратиться.

+0

Просто добавлена ​​структура документа. – user577808

+0

Я нашел следующий запрос: User.collection.update ({"alerts._id" => alert.id}, {: $ set => {"warning. $. Matches" => ["WTF? ?? "]}}) – user577808

+0

Это предполагает, что у меня должен быть указатель на" alerts._id "правильно? Кроме того, зависит ли оператор позиционирования от селектора? IE. Если мой селектор был {"_id" => user.id}, то позиция не будет работать правильно? – user577808

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