Skip to main content
 首页 » 编程设计

ruby-on-rails之在mongodb中的文档中删除字段-Rails + Mongoid

2025年05月04日120dudu

我想使用ROR删除文档中的字段。

我已经尝试过

  • book.remove_attribute(:name)
  • book.unset(:name)

  • 但是他们都将属性设置为nil,并且该属性仍然存在于对象中。

    我希望它从我的文档中消失。欢迎任何帮助。

    请您参考如下方法:

    通过mongoid访问文档时,它将返回一个Ruby对象。实际上,您只能通过mongo shell看到存储在文档中的数据(只需在终端中键入“mongo”)。

    该对象由Mongoid(用于 rails 的MongoDB ODM/包装器)创建。该对象有时看起来可能与文档不同。

    例如

    取消设置字段时,该字段将从该文档中完全删除。但是,由于模型仍然具有该字段,因此MONGOID会为您返回该字段的nil属性,而不是为相同模型的对象提供不同数量的字段。

    样板书.rb

    class Book 
      include Mongoid::Document 
     
      field :name 
      field :author 
    end 
    

    在Rails控制台中,键入
     Book.create(name: "b1", author: "a1") 
        => #<Book _id: 555231746c617a1c99030000, name: "b1", author: "a1"> 
    

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

    现在,我们取消设置。

    在Rails控制台中
    Book.first.unset(:name) 
     => #<Book _id: 555231746c617a1c99030000, name: nil, author: "a1"> 
    

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

    但是,如果您仍然不想在Rails控制台中看到该字段(请注意,这不会占用db中的任何额外空间),则可以随时从模型中删除该字段。如果这样做,您将不再能够通过任何对象上的rails/mongoid访问此字段。它只会出现在文档中,并且可以通过mongo shell访问。