2015-05-08 13 views
5

Chcę usunąć pole w dokumencie za pomocą ROR.Usuń pole w dokumencie w mongodb - Rails + Mongoid

Próbowałem już

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

Ale oboje ustawić atrybut do zera i jest nadal obecny w obiekcie.

Chcę, aby zniknął z mojego dokumentu. Każda pomoc jest mile widziana.

+0

Mój wymóg jest taki, że po usunięciu go, kiedy otrzymam go w następnym wywołaniu, nie powinienem otrzymać tego atrybutu. Ale dostaję to z zerową wartością. –

+0

Otrzymuję cały obiekt i zwracam go. Book.find (parametry [: id]), nie ma dostępu do poszczególnych pól. Masz rację. remove_attribute usuwa go z mongodb, ale dlaczego otrzymam go jako zero, kiedy robię Book.find (params [: id]) lub Book.all? –

+0

Tak, zgadza się. Wielkie dzięki! Tęskniłem za tak trywialną rzeczą. –

Odpowiedz

4

Po uzyskaniu dostępu do dokumentu przez mongoid, zwraca on obiekt Ruby. Możesz zobaczyć dane zapisane w dokumencie tylko przez mongo shell (wystarczy wpisać "mongo" w swoim terminalu).

Obiekt jest tworzony przez Mongoid (MongoDB ODM/wrapper for rails). Obiekt ten może czasami wyglądać inaczej niż dokument.

Na przykład

po wyłączeniu trybu pola, które pole jest całkowicie usunięty z tego dokumentu. ALE, ponieważ twój model nadal zawiera to pole, MONGOID zwraca ci zerowy atrybut dla tego pola, zamiast dawać inną liczbę pól dla obiektów tego samego modelu.

model book.rb

class Book 
    include Mongoid::Document 

    field :name 
    field :author 
end 

W konsoli szyn typu

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

W Mongo shell

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

Teraz wyłączonym.

W konsoli szyn

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

W Mongo shell

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

Jeśli jednak nadal nie chcą zobaczyć pola w konsoli szyn (Pamiętaj, to nie podejmuje się żadnej dodatkowej przestrzeni w db) zawsze możesz usunąć pole z modelu. Jeśli to zrobisz, utracisz dostęp do tego pola przez szyny/mongoid na dowolnym obiekcie. Będzie on obecny tylko w dokumencie i dostępny przez powłokę Mongo.

Powiązane problemy