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

时间:2011-01-17 06:04:50

标签: ruby-on-rails arrays mongoid mongodb

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

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 } }

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

添加许多valuest.update

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

{ $pop : { field : 1  } }

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

{ $pop : { field : -1  } }

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

4 个答案:

答案 0 :(得分:10)

您想要使用add_to_set方法,如(在某处)记录的那样:http://mongoid.org/en/mongoid/docs/persistence.html#atomic

示例:

model = Model.new
model.add_to_set(:field, value)
model.save

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

答案 1 :(得分:8)

来自Mongoid googlegroup的Chris Hawk:

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

因此,对于插入,您只需执行以下操作:

array << object unless array.include?(object) 

要删除:

array.delete(object) 

答案 2 :(得分:0)

值得一提的是,在mongoid中,从2.0.0pre4开始,我没有看到任何addToSet支持。 mongo_mapper(虽然imo less maintain :()通过push_uniq方法支持这个。

除此之外,在mongoid中,如果你直接使用关系方法,你不需要做包含?如果你直接使用数组,你可以。

示例:

class Person
   include Mongoid::Document
   has_and_belongs_to_many :pets ## or has_many :pets, :stored_as => :array if your not using the latest mongoid 
end

#when using .pets no need to check, mongoid checks for you to ensure you can only add the same pet once.
pet = Pet.find("294x29s9a9292")
p = Person.find("42192189a92191a")
p.pets << pet

#when using pet_ids, you do need to check:
pet = Pet.find("294x29s9a9292")
p = Person.find("42192189a92191a")
p.pet_ids << pet.id unless p.pet_ids.include? pet.id

答案 3 :(得分:0)

您可以使用原子的pull operator来删除单个元素。这是一个示例,其中l是对包含数组字段array的文档的引用:

l.array = [1, 2, 3]
l.save
l.pull(array: 1) # atomically removes 1, leaving [2, 3]

可以使用add_to_set进行添加,如前所述:

l.array = [2, 3]
l.save
l.add_to_set(array: 1) # atomically adds 1, resulting in [2, 3, 1]

Here's a link to the current Mongoid documentation on Atomic operators.