2010-09-12 21 views
5

Ho un modello di progetti con solo un campo nome e in esso anche la relazione incorporata a line_items. progetto di classe includono mongoid :: documento : nome embeds_many: line_items finerimuovere un documento incorporato in mongoid

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

suppongo questo è più della questione conducente mongo: se avessi un tale documento

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) Come posso aggiornare l'elemento pubblicitario con ID 601 nella console di mongo?
  • 2) come si elimina?

Grazie!

risposta

1

1/Aggiornamento:

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

2/delete:

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

Grazie Shingara, ma questo è da Rails Console, non dalla console MongoDB. Ti capita di sapere qual è la sintassi per mongodb? –

+0

per l'eliminazione è quella della terza riga corretta? nella maggior parte dei casi non conoscerai l'ID dell'elemento incorporato, quindi probabilmente eseguirai un: line_item = pro.line_items.where (: title => "xxx"). prima e poi un pro.line_item_ids.delete (Line_Item.id) – Nader

0

Prova ...

Aggiornamento:

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

Elimina:

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

Mi dispiace, provalo ora?

+0

Grazie Luckytaxi. L'aggiornamento funziona, ma la rimozione rimuove effettivamente i progetti contenenti un elemento pubblicitario con un id 601 –

15

Mongoid corrente (2.0.0) permette:

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

e la conseguente query di database/aggiornamento appare come:.

MongoDB prova [ 'liste'] aggiornamento ({ "_ id "=> BSON :: ObjectId ('4d9522315569b11918000019')}, { " $ tirare "=> {" categorie "=> {" _ id "=> BSON :: ObjectId ('4d9523e05569b1191800001f')}}})

Vedere anche l'ultimo esempio su http://mongoid.org/docs/persistence/

Nota, ho provato delle varianti su questo che avrebbero funzionato con ActiveRecord (@ list.categories.delete (xx)) e quelle non sembrano avere alcun effetto.

0

Prova:

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

per rimuovere i documenti incorporati, questo ripristinerà solo i dati al suo interno da svuotare ma manterrà comunque un oggetto vuoto nel db che è possibile ripopolare in seguito.

+0

Ciao Anand, grazie per aver dato una risposta. Penso di essere più alla ricerca dell'eliminazione di un solo record incorporato invece di cancellare tutti i record incorporati in un'associazione embeds_many. Ma grazie comunque! –

Problemi correlati