我需要在具有数组属性的Mongoid对象中进行搜索。以下是相关对象:
class Author
include Mongoid::Document
field :name, type: String
class Book
include Mongoid::Document
field :name, type: String
field :authors, type: Array
我可以看到至少有一本书有给定的作者:
Book.all.sample.authors
=> [BSON::ObjectId('5363c73a4d61635257805e00'),
BSON::ObjectId('5363c73a4d61635257835e00'),
BSON::ObjectId('5363c73a4d61635257c75e00'),
BSON::ObjectId('5363c73b4d616352574a5f00')]
但是我找不到那个有作者的书。
Book.where(authors: '5363c73a4d61635257805e00').first
=> nil
我已尝试过此处列出的解决方案:https://groups.google.com/forum/#!topic/mongoid/csNOcugYH0U但它对我没有用处:
Book.any_in(:author => ["5363c73b4d616352574a5f00"]).first
=> nil
我不确定我做错了什么。有任何想法吗?我更喜欢使用Mongoid Origin命令。
答案 0 :(得分:1)
此输出:
Book.all.sample.authors
=> [BSON::ObjectId('5363c73a4d61635257805e00'),
BSON::ObjectId('5363c73a4d61635257835e00'),
BSON::ObjectId('5363c73a4d61635257c75e00'),
BSON::ObjectId('5363c73b4d616352574a5f00')]
告诉我们authors
包含BSON::ObjectId
个。 ObjectIds通常表示为字符串,有时您可以使用String而不是完整的ObjectId(例如Model.find
),但它们仍然不是字符串。您正在数组中搜索 String :
Book.where(authors: '5363c73a4d61635257805e00')
但是'5363c73a4d61635257805e00'
和ObjectId('5363c73a4d61635257805e00')
在MongoDB中并不相同。你需要寻找合适的东西:
Book.where(authors: BSON::ObjectId('5363c73a4d61635257805e00'))
您可能希望将to_bson_id
方法修补到各个地方。像这样:
class String
def to_bson_id
BSON::ObjectId.from_string(self)
end
end
module Mongoid
module Document
def to_bson_id
id
end
end
end
module BSON
class ObjectId
def to_bson_id
self
end
end
end
class NilClass
def to_bson_id
self
end
end
应该做的伎俩。然后你可以这样说:
Book.where(authors: '5363c73a4d61635257805e00'.to_bson_id)
Book.where(authors: some_string_or_object_id.to_bson_id)
正确的事情发生了。
您可能希望将authors
重命名为author_ids
,以使其性质更加清晰。