2010-09-12 8 views
5

J'ai un modèle de projet avec juste un champ de nom et dans cela aussi la relation imbriquée à line_items. projet de classe comprennent MongoId :: documents champ: nom embeds_many: line_items finsupprimer un document incorporé dans mongoid

class LineItem 
    include mongoid::document 
    field :title 
    embedded_in :project, :inverse_of => :line_items 
    end 

Je suppose que cela est plus de la question du pilote mongo: si j'avais un tel document

db.project.find()[0] 
     { 
     _id : 123, 
     name : "housework", 
     line_items:[ 
     { title : "clean fridge", _id : 601}, 
     { title : "clean tub", _id : 602}, 
     { title : "clean oven", _id : 603} 
     ] 
     } 
  • 1) Comment mettre à jour l'élément de campagne avec l'ID 601 dans la console mongo?
  • 2) comment le supprimer?

Merci!

Répondre

1

1/Mise à jour:

pro = Project.first 
line_item = pro.line_items.find(601) 
line_item.title = 'new title' 
line_item.save 

2/Supprimer:

pro = Project.first 
line_item = pro.line_items.find(601) 
pro.line_item_ids.delete(601) 
pro.save 
+0

Merci Shingara, mais cela vient de Rails Console, pas de la console MongoDB. Savez-vous quelle est la syntaxe de mongodb? –

+0

pour la suppression est que la troisième ligne correcte? Dans la plupart des cas, vous ne connaîtrez pas l'ID de l'élément incorporé, donc vous feriez probablement un: line_item = pro.line_items.where (: title => "xxx"). d'abord, puis un pro.line_item_ids.delete (line_item.id) – Nader

0

Essayez ...

Mise à jour:

db.project.update({ line_items._id : 601 }, { $set : { line_items.title : "new title" } }) 

Supprimer:

db.project.update({ $pull : { line_items._id : 601 } }) 

Désolé, essayez-le maintenant?

+0

Merci Luckytaxi. La mise à jour fonctionne, mais la suppression supprime réellement le projet (s) contenant un élément de campagne avec un ID 601 –

15

actuelle MongoId (2.0.0) permet:

@category = @list.categories.find(params[:id]) 
@category.delete 

Et la requête de base de données résultant/mise à jour ressemble à:.

MongoDB Test [ 'listes'] de mise à jour ({ "id _ "=> BSON :: ObjectId ('4d9522315569b11918000019')}, {" $ pull "=> {" categories "=> {" _ id "=> BSON :: ObjectId ('4d9523e05569b1191800001f')}}})

Voir aussi le dernier exemple sur http://mongoid.org/docs/persistence/

Remarque, j'ai essayé des variantes qui auraient fonctionné avec ActiveRecord (@ list.categories.delete (xx)) et celles-ci ne semblent pas avoir d'effet.

0

Essayez:

db.project.update ({}, {$ set: {line_items: []}});

Pour supprimer des documents incorporés, cela ne réinitialisera que les données à l'intérieur, mais conservera un objet vide dans la base de données que vous pourrez repeupler plus tard.

+0

Bonjour Anand, merci de donner une réponse. Je pense que je suis plus à la recherche de supprimer un seul enregistrement incorporé au lieu de supprimer tous les enregistrements incorporés dans une association embeds_many. Mais merci quand même! –

Questions connexes