Mongoid无需Rails

15

我正在使用独立的Ruby应用程序,并且无法配置Mongoid 3.0.13进行工作。

我遇到了一些示例应用程序,它们具有以下配置块:

Mongoid::Config.instance.from_hash({"database" => "oid"}) 

或者

Mongoid.configure do |config|
 name = "mongoid_test_db"
 host = "localhost"
 port = 27017
 config.database = Mongo::Connection.new.db(name)
end

这导致:

undefined method `database=' for Mongoid::Config:Module (NoMethodError)

看起来最近配置设置有所改变。

我也尝试过:

Mongoid::Config.connect_to("sweet")

但是那似乎没有任何作用。

4个回答

13

如果您说“独立”,我理解为不使用Rails。无论您如何运行它,Mongoid都提供了一种简单的方法来使其工作。

  1. 像平常一样在mongoid.yml文件中定义数据库连接信息。
development:
  clients:
    default:
      database: mongoid
      hosts:
        - localhost:27017
  1. 确保你的应用程序已经引入了 Mongoid。
  2. 调用 Mongoid.load! 使 Mongoid 解析你的配置文件并初始化自己。
require 'mongoid'
Mongoid.load!('/path/to/your/mongoid.yml')

这些信息也可以在此处找到,位于“Sinatra、Padrino和其他”部分下: http://mongoid.org/en/mongoid/docs/installation.html 对于非 Web 应用程序也适用相同的方法。希望这有所帮助。

@ashes999 答案是正确的。:-/ 只需要深入挖掘并了解 mongoid 数据库底层发生的事情即可。"client" 是官方 MongoDB 术语,你可以在他们的文档中找到,而 mongoid 在此基础上添加了 "session" 的概念。在现代版本的 mongoid 中,整个 session 概念已经被取消了。 - Brandon Black

4

试试这个:

prompt> ruby myapp.rb 
hello world

prompt> cat mongoid.yml 
development:
  sessions:
    default:
      database: myapp
      hosts:
        - localhost:27017

prompt> cat myapp.rb 
require 'mongoid'
Mongoid.load!("mongoid.yml", :development)
puts "hello world"

1
+1 你提供的 mongoid.yml 工作示例解决了我的问题,即 确保您拥有一个顶级会话键,并为其配置至少1个默认会话配置。官方的Mongo文档使用 clients 而不是 sessions,这是无法工作的。 - ashes999

0

如果您想从mongoid配置文件中加载,请使用Mongoid.load!,前面的答案是正确的。我遇到了一个情况,需要将Mongoid配置嵌入到另一个配置文件中。因此,我需要一种从哈希加载配置的方法。

在>3.1中,您将能够调用Mongoid.load_configuration(hash)。

不幸的是,在3.0中,此函数是私有的。因此,在加载Mongoid之前设置一个公共别名方法:

module Mongoid
  module Config
    def load_configuration_hash(settings)
      load_configuration(settings)
    end
  end
end

确保在调用 require 'mongoid' 之前调用此代码。现在,您可以调用 Mongoid.load_configuration_hash(hash)。


0
您可以确认您可以直接从IRB创建数据库,向数据库添加集合并向集合添加文档。
$ rvm use 2.4.1

$ rvm-prompt
$ ruby-2.4.1

$ rvm gemset create mongoid_test
$ rvm use @mongoid_test

$ gem install mongoid

$ gem list | grep mongoid
$ mongoid (7.0.2)

$ rvm-prompt
$ ruby-2.4.1@mongoid_test

$ irb
> require 'mongoid'
 => true

> Mongoid.load!('mongoid.yml', :development)
 => {"clients"=>{"default"=>{"database"=>"mongoid_test", "hosts"=>["localhost:27017"]}}} 

> class LineItem
   include Mongoid::Document
   include Mongoid::Attributes::Dynamic
 end

> item = LineItem.new
> item['cost'] = 12.00
> item['quantity'] = 3
> item['name'] = 'Protein Bars'
> item.save!
 => true 
> LineItem.all.size
 => 1 
> i = LineItem.first
 => #<LineItem _id: 5c552b8d496a9d0828b374b5, cost: 12.0, quantity: 3, name: "Protein Bars"> 
> i.fields.keys
 => ["_id"] 
i.inspect_dynamic_fields
 => ["cost: 12.0", "quantity: 3", "name: \"Protein Bars\""] 

打开MongoDB shell并确认您的数据是否存在:

$ mongo
> show dbs
admin
config
local
mongoid_test

> use mongoid_test
switched to db mongoid_test
> show collections
line_items
> db.line_items.find({ cost: 12.0, quantity: 3, name: 'Protein Bars'}, {_id: 0})
{ "cost" : 12, "quantity" : 3, "name" : "Protein Bars" }

直截了当,灵活而且相当动态。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接