在属性数组中查询mongoid的值

时间:2014-05-31 20:50:50

标签: ruby mongodb mongoid

我需要在具有数组属性的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命令。

1 个答案:

答案 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,以使其性质更加清晰。