Mongoid - 阵列管理?插入唯一值,如果存在则删除值?

Ale*_*lex 7 arrays ruby-on-rails mongodb mongoid

我想做一些相当简单的事情我相信:

1)仅当该值尚未存在时才在数组字段中插入值

2)删除数组中存在的值

我只是不知道如何做这些事情......目前我只是插入我的值而不检查它是否已经存在:myArray << obj.id

谢谢,

亚历克斯

ps:使用Rails 3.0.3,mongo 1.1.5和mongoid 2.0.0.rc5

ps2:这是实现我想要的mongodb语法,但我不知道如何在mongoid中做到这一点

{ $addToSet : { field : value } }
Run Code Online (Sandbox Code Playgroud)

仅当数组不在数组中时才添加值,如果field是现有数组,否则在字段不存在时将字段设置为数组值.如果字段存在但不是数组,则会引发错误情况.

添加许多valuest.update

{ $addToSet : { a : { $each : [ 3 , 5 , 6 ] } } }
$pop

{ $pop : { field : 1  } }
Run Code Online (Sandbox Code Playgroud)

删除数组中的最后一个元素(1.1中的ADDED)

{ $pop : { field : -1  } }
Run Code Online (Sandbox Code Playgroud)

删除数组中的第一个元素(1.1中的ADDED)|

xen*_*tek 10

您想要使用该add_to_set方法,如此处(在某种程度上):http://mongoid.org/en/mongoid/docs/persistence.html#atomic

例:

model = Model.new
model.add_to_set(:field, value)
model.save
Run Code Online (Sandbox Code Playgroud)

您可以为其提供单个值甚至数组值.后者将使用mongo的$each限定符以及$addToSet将数组的每个元素添加到指定的字段时.


Ale*_*lex 8

根据来自Mongoid googlegroup的Chris Hawk:

Mongoid文档中的数组是简单的Ruby数组.请参阅Array类的文档:http://www.ruby-doc.org/core/classes/Array.html

因此,对于插入,您可以简单地执行:

array << object unless array.include?(object) 
Run Code Online (Sandbox Code Playgroud)

并删除:

array.delete(object) 
Run Code Online (Sandbox Code Playgroud)

  • 是否有竞争条件的风险?我认为最好使用原子$ addToSet (2认同)