从mongoid中删除嵌入式文档

5

我有一个项目模型,只有一个名称字段,并且其中还嵌入了与line_items的关系。 class Project include mongoid::document field :name //名称字段 embeds_many :line_items //嵌入多个line_items end

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

我想这更像是一个Mongo驱动程序的问题:如果我有这样的一个文档

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) 如何在Mongo控制台中更新id为601的行项目?
  • 2) 如何删除它?

谢谢!

4个回答

15

目前的Mongoid(2.0.0)允许:

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

生成的数据库查询/更新如下:

MONGODB test['lists'].update({"_id"=>BSON::ObjectId('4d9522315569b11918000019')}, {"$pull"=>{"categories"=>{"_id"=>BSON::ObjectId('4d9523e05569b1191800001f')}}})

请参阅http://mongoid.org/docs/persistence/上的最后一个示例。

请注意,我尝试了一些在ActiveRecord中可能有效的变体(例如@list.categories.delete(xx)),但它们似乎没有任何效果。


1

1/ 更新:

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

2/ 删除:

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

谢谢Shingara,但这是来自Rails Console,而不是来自MongoDB控制台。你知道mongodb的语法是什么吗? - Nik So
对于删除操作,第三行是否正确?在大多数情况下,您不会知道嵌入项的ID,因此您可能会执行以下操作:line_item = pro.line_items.where(:title => "xxx").first,然后执行pro.line_item_ids.delete(line_item.id) - Nader

0
尝试使用以下代码:

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

通过此方式可以删除嵌套文档,它只会将其内部数据重置为空,但仍会在数据库中保留一个空对象,您随后可以重新填充。

嗨,Anand,感谢你的回答。我想我更希望删除一个嵌入式记录,而不是删除embeds_many关联中的所有嵌入式记录。但无论如何还是谢谢! - Nik So

0

尝试...

更新:

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

删除:

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

非常抱歉,现在可以试试吗?


谢谢Luckytaxi。更新已经生效,但是删除实际上会删除包含id为601的行项目的项目。 - Nik So

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接