2012-05-08 7 views
3

Nous avons des documents intégrés qui ressemblent à ceci:Mise à jour dans MongoDB dans un seul document intégré

{ 
"_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") 
    } 
] 
} 

Puisque le document ci-dessus est contenu dans un tableau, je vais avoir du mal à choisir dehors forme la Sélecteur avec quelque chose comme ceci:

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

Mais cela mettra à jour tous les #alerts. Je veux juste mettre à jour l'alerte avec l'ID "4fa7fd60e5be08bcc9000644".

+0

Il est préférable de publier un document json exact. –

+0

Il s'agit de l'implémentation du pilote ruby, JSON n'est pas pertinent. – user577808

+0

Eh bien, je ne suis pas sûr de ce que je vois ici. Si les gens ne peuvent pas vous aider, cela devient pertinent :) –

Répondre

5

Vous pouvez probablement utiliser le positional operator pour identifier l'élément de tableau:

L'opérateur de position $

L'opérateur $ (par lui-même) signifie « position de l'élément de tableau apparié dans la requête ". Utilisez ceci pour trouver un membre du tableau, puis manipulez-le.

Alors peut-être quelque chose comme:

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

Mais comme le fait remarquer Sergio, il est difficile de démêler la structure de vos documents sur la base des informations limitées dans votre question.


On dirait que plus d'informations est arrivé après répondu et il ressemble à:

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

est ce que vous avez besoin. Et vous devrez inclure :matches dans la requête afin que $ a quelque chose à se référer.

+0

Juste ajouté la structure du document. – user577808

+0

J'ai trouvé la requête suivante l'a fait: User.collection.update ({"alerts._id" => alert.id}, {: $ set => {"alertes. $. Correspond" => ["WTF? ?? "]}}) – user577808

+0

Cela suppose que je dois avoir un index sur" alerts.id "à droite? De plus, l'opérateur de position dépend-il du sélecteur? IE. Si mon sélecteur était {"_id" => user.id}, alors la position ne fonctionnerait pas correctement? – user577808

Questions connexes