2015-05-08 16 views
5

Voglio eliminare un campo in un documento usando ROR.Elimina un campo in un documento in mongodb - Rails + Mongoide

Ho già provato

  1. book.remove_attribute (: nome)
  2. book.unset (: nome)

Ma entrambi impostare l'attributo a zero ed è ancora presente nell'oggetto.

Voglio che sparisca dal mio documento. Qualsiasi aiuto è benvenuto.

+0

Il mio requisito è che dopo averlo rimosso, quando ricevo la chiamata successiva, non dovrei ottenere quell'attributo. Ma lo ottengo con un valore nullo. –

+0

Sto recuperando l'intero oggetto e restituendolo. Book.find (params [: id]), non accede a singoli campi. Hai ragione. remove_attribute lo rimuove da mongodb ma poi perché lo ottengo come zero quando faccio Book.find (params [: id]) o Book.all? –

+0

Sì, è corretto. Molte grazie! Ho perso una cosa così banale. –

risposta

4

Quando si accede a un documento tramite mongoid, viene restituito un oggetto Ruby. È possibile visualizzare i dati memorizzati nel documento solo tramite mongo shell (è sufficiente digitare "mongo" nel terminale dell'utente).

L'oggetto è stato creato da Mongoid (MongoDB ODM/wrapper for rails). Talvolta questo oggetto può apparire diverso dal documento.

Per esempio

quando si torna dall un campo, quel campo è interamente rimosso da quel documento. MA, poiché il tuo modello ha ancora quel campo, MONGOID ti restituisce un attributo nullo per quel campo, invece di darti un numero diverso di campi per oggetti dello stesso modello.

Modello book.rb

class Book 
    include Mongoid::Document 

    field :name 
    field :author 
end 

In console rotaie, tipo

Book.create(name: "b1", author: "a1") 
    => #<Book _id: 555231746c617a1c99030000, name: "b1", author: "a1"> 

In Mongo shell

db.books.find() 
{ "_id" : ObjectId("555231746c617a1c99030000"), "name" : "b1", "author" : "a1" } 

Ora, abbiamo disinserita.

Nella console rotaie

Book.first.unset(:name) 
=> #<Book _id: 555231746c617a1c99030000, name: nil, author: "a1"> 

In Mongo shell

db.books.find() 
{ "_id" : ObjectId("555231746c617a1c99030000"), "author" : "a1" } 

Se invece ancora Non volete vedere il campo nella tua console rotaie (si badi bene, questo non sta prendendo qualsiasi spazio in più in db) puoi sempre rimuovere il campo dal modello. Se lo fai, non sarai più in grado di accedere a questo campo attraverso le rotaie/mongoi su qualsiasi oggetto. Sarà presente solo nel documento e accessibile tramite la shell mongo.

Problemi correlati