0

让我从我的用例开始。我有两个不同的 mongoid 数据库实例,每个区域都基于类似的模型托管。并且根据用户输入,代码会从我的 rails 应用程序中的各个 mongo 实例中获取结果。我不确定这样做的最佳方法是什么,但是我使用了 Model.with 方法并在 mongoid.yml 中配置了两个客户端。

对于 mongoid <5.0,这很完美。但是,最近我正在升级到 Model.with 现在接受块的 mongoid 6.2,并且我的查询没有产生任何结果。

这是示例代码。

我从下面更改了我的代码(mongoid <5 效果很好)

results = SomeModel.with(client: "region1").where(name: 'John')

到 (mongoid >= 6.2)

results = SomeModel.with(client: "region1") do |mymodel|
    mymodel.where(name: 'John')
end

使用新代码,结果为空。不确定我是否做错了什么。但是,如果只需要一条记录,下面的代码可以正常工作:

results = SomeModel.with(client: "region1") do |mymodel|
    mymodel.where(name: 'John').first
end

如果我的用例有任何其他想法,我将不胜感激。

4

1 回答 1

0

我只使用过 Mongoid 6,而且是最近,但也许这会有所帮助。不过,这与多客户案例无关。

好吧,#first实际上是说,从那个标准{name: 'john'}给我第一次出现。

是不是当你调用 a 时#where,你只是声明了条件参数,但实际查询在你请求实际数据之前不会执行?

我不是 100% 确定,但是。

:001 > Book.where(name: "my book")
 => #<Mongoid::Criteria
  selector: {"name"=>"my book"}
  options:  {}
  class:    Book
  embedded: false>

 :002 > Book.where(name: "my book").first
 => #<Book _id: 5954ae90ASDF10fe7739cbe, name: "my book", code: "ASDF-1234-qwer-3456">
 :003 >

现在,如果您想要收集数据而不是条件本身,您可能想要在该对象上调用一个方法,例如#to_a, #to_json, #first, #last,使用 迭代它们#each,甚至使用类似的运算符[0]。这将为您带来与您之前声明的标准相对应的数据。

这就是我的想法,因为当我#where从我的 rails 应用程序中抛出一个控制器的方法,并且结果呈现为 JSON 时,调用#as_json是隐式的。

也许尝试调用 a#to_a并返回完整的对象数组。

于 2017-07-23T07:32:45.363 回答