我有一个带有MongoID 3的Rails 3应用程序成功部署到Heroku(使用MongoHQ) - 但后来发生了一些事情(无法确切地指出它是什么)并且构建开始在Heroku上崩溃.
所以这是我得到的错误:
TLDR: Moped::Errors::AuthenticationFailure (The operation: #<Moped::Protocol::Commands::Authenticate ... failed with error "auth fails")
使调试更加困难的原因是它在localhost上运行得很好.现在我的想法已经不多了.
app[web.1]: >> Thin web server (v1.4.1 codename Chromeo)
app[web.1]: >> Maximum connections set to 1024
app[web.1]: >> Listening on 0.0.0.0:58731, CTRL+C to stop
heroku[web.1]: State changed from starting to up
app[web.1]:
app[web.1]:
app[web.1]: Started GET "/" for 212.86.9.90 at 2012-07-31 08:08:07 +0000
heroku[router]: GET cool-name-123.herokuapp.com/ dyno=web.1 queue=0 wait=0ms service=171ms status=200 bytes=1286
heroku[router]: GET cool-name-123.herokuapp.com/assets/application-8e7bfeeffc9291864e5b42d908c2fdda.css dyno=web.1 queue=0 wait=0ms service=11ms status=200 bytes=92524
heroku[router]: GET …Run Code Online (Sandbox Code Playgroud) 据说这个问题已解决了最新版本的轻便摩托车但仍然在我身上发生.我有一个带有Mongoid的rails 4.2应用程序,为具有readWrite和dbOwner角色的MongoDB DB创建了一个用户,并在mong.conf文件中设置了auth = true.
我可以使用Mongo shell或使用Mongo驱动程序的简单Java应用程序,使用该用户凭据对数据库执行任何操作.
但是,当尝试使用Mongoid进行身份验证时,我总是会收到此错误:
失败,错误13:"未授权查询my_db.my_collection"
这是我的mongoid.yml文件的相关部分:
production:
# Configure available database sessions. (required)
sessions:
# Defines the default session. (required)
default:
# Defines the name of the default database that Mongoid can connect to.
# (required).
database: my_db
hosts:
- localhost:27017
username: my_username
password: my_password
Run Code Online (Sandbox Code Playgroud)
我也尝试用服务器的远程地址替换主机并远程访问它(这与禁用的身份验证选项一起使用)没有成功.为了它的价值,我可以通过调试mpped/node.rb文件看到凭证,在ensure_connected方法中我看到@credentials变量包含我的用户名和密码我在这里缺少什么?谢谢!
我正在使用Mongoid(v3)来访问MongoDB,并希望执行此操作:
db.sessionlogs.update(
{sessionid: '12345'}, /* selection criteria */
{'$push':{rows: "new set of data"}}, /* modification */
true /* upsert */
);
Run Code Online (Sandbox Code Playgroud)
这在mongo shell中工作正常.它也正是我想要的,因为它是一个单一的原子操作,对我来说很重要,因为我会调用它.我不想做两个操作 - 获取然后更新.我通过mongoid尝试了很多东西,但无法让它工作.
如何将MongoID取出并将此命令发送到MongoDB?我猜测在Moped级别有一些方法可以做到这一点,但该库的文档基本上不存在.
在运行Sidekiq时,我看到大量的工作失败,这些工作都与我的Mongo数据库的连接问题有关.我压力测试机器有很多负载,所以我排队了18,000多个工作,失败时重试5秒.一些工作(我猜测那些能够成功检索连接线程的工作者)工作得很好.然后我有很多其他人有这样的错误:
2013-12-26T19:25:35Z 13447 TID-m2biw WARN: {"retry"=>true, "queue"=>"default",
"class"=>"ParseFileWorker", "args"=>[{"filename"=>"/opt/media/AE-67452_36.XML"}],
"jid"=>"5d6c48fa94ed8c8da1b226fc", "enqueued_at"=>1388084903.6113343,
"error_message"=>"Could not connect to a primary node for replica set #
<Moped::Cluster:44552140 @seeds=[<Moped::Node resolved_address=\"127.0.0.1:27017\">]>",
"error_class"=>"Moped::Errors::ConnectionFailure", "failed_at"=>"2013-12-26T19:16:25Z",
"retry_count"=>3, "retried_at"=>2013-12-26 19:25:35 UTC}
Run Code Online (Sandbox Code Playgroud)
还有超时错误,如下所示:
Timeout::Error: Waited 0.5 sec
Run Code Online (Sandbox Code Playgroud)
注意,我正在运行Rails 4,并在https://github.com/mongoid/mongoid中从主分支中检出Mongoid代码.根据我的阅读,以前版本的Mongoid需要在Sidekiq作业完成处理时明确关闭连接.Mongoid 4应该自动完成.我无法确认它是否正在这样做.当作业排队太快,连接不可用或超时时,问题似乎是两倍.一些工人成功地打开了连接.有些工作必须等到重试解析.
我不完全确定这里最好的解决方案是什么.如果我慢慢排队工作,一切正常.不幸的是,这不是应用程序在现实世界中的运作方式.
我如何确保我的sidekiq作业获得完成工作所需的Moped/Mongoid连接,或者等待其中一个可用于处理?由于这个问题,看到了大量的例外/错误.下面是常见错误的堆栈跟踪:
2013-12-26T20:56:58Z 1317 TID-i70ms ParseFileWorker JID-0fc375d8fd9707e7d3ec3238 INFO: fail: 1.507 sec
2013-12-26T20:56:58Z 1317 TID-i70ms WARN: {"retry"=>true, "queue"=>"default", "class"=>"ParseFileWorker", "args"=>[{"filename"=>"/opt/media/AC-19269_287.XML"}], "jid"=>"0fc375d8fd9707e7d3ec3238", "enqueued_at"=>1388091410.0421875, "error_message"=>"Waited 0.5 sec", "error_class"=>"Timeout::Error", "failed_at"=>2013-12-26 20:56:58 UTC, "retry_count"=>0}
2013-12-26T20:56:58Z 1317 TID-i70ms WARN: Waited 0.5 sec
2013-12-26T20:56:58Z 1317 TID-i70ms …Run Code Online (Sandbox Code Playgroud) 我最近使用rails 3.2.12和ruby 1.9.3从mongoid 2.0.2升级到mongoid 3.
Following issue comes when save command excutes => @new_node.save
Moped::Errors::OperationFailure (The operation: #<Moped::Protocol::Command
@length=366
@request_id=30
@response_to=0
@op_code=2004
@flags=[:slave_ok]
@full_collection_name="campus_dev.$cmd"
@skip=0
@limit=-1
@selector={:aggregate=>"nodes", :pipeline=>[{"$match"=>{"parent_id"=>"51382df8851d1912b7000009", "_id"=>{"$ne"=>"513f24952f1feda4bc000002"}, "position"=>{"$nin"=>[nil]}}}, {"$group"=>{"_id"=>"position", "count"=>{"$sum"=>1}, "max"=>{"$max"=>"$position"}, "min"=>{"$min"=>"$position"}, "sum"=>{"$sum"=>"$position"}, "avg"=>{"$avg"=>"$position"}}}]}
@fields=nil>
failed with error "no such cmd"):
app/controllers/nodes_controller.rb:37:in `create'
Run Code Online (Sandbox Code Playgroud) 当我使用mongo-ruby-driver并插入新文档时,它返回生成的'_id':
db = MongoClient.new('127.0.0.1', '27017').db('ruby-mongo-examples')
id = db['test'].insert({name: 'example'})
# BSON::ObjectId('54f88b01ab8bae12b2000001')
Run Code Online (Sandbox Code Playgroud)
在使用Moped进行插入后,我试图获取文档的"_id":
db = Moped::Session.new(['127.0.0.1:27017'])
db.use('ruby-mongo-examples')
id = db['coll'].insert({name: 'example'})
# {"connectionId"=>15, "n"=>0, "syncMillis"=>0, "writtenTo"=>nil, "err"=>nil, "ok"=>1.0}
Run Code Online (Sandbox Code Playgroud)
我如何使用轻便摩托车获得身份证?
更新:
我也尝试使用安全模式,但它不起作用:
db = Moped::Session.new(['127.0.0.1:27017'])
db.use('ruby-mongo-examples')
db.with(safe: true) do |safe|
id = safe['coll'].insert({name: 'example'})
# {"connectionId"=>5, "n"=>0, "syncMillis"=>0, "writtenTo"=>nil, "err"=>nil, "ok"=>1.0}
end
Run Code Online (Sandbox Code Playgroud) 我在mongodb中有以下查询db,它返回我需要的内容:
db.collection.find({field1: 2801394}, {name: 1, field2: 1, _id: 1, "field3.2801394": 1})
Run Code Online (Sandbox Code Playgroud)
注意字段3是散列,此处使用的密钥与字段1中的值相同.
如何将此查询转换为mongoid?这里有两个主要问题,我无法在线找到任何一个单独的问题:
谢谢!
我是mongodb&mongoid的新手..这是一个在某些pont上的mongoid 2上的rails应用程序,后来转移到了mongoid 3
我正在尝试运行迁移,其中一个具有以下内容
Assessment.collection.update({'result_access' => {'$exist' => false}}, {'$set' => {'result_access' => 'all'}}, {:multi => true})
Run Code Online (Sandbox Code Playgroud)
我不确定如何为mongoid 3更新这个
我有一个具有以下结构的集合中的用户文档:
{ "_id" : ObjectId( "4fb54ef46d93b33b21003951" ),
"activities" : [
{ "id" : ObjectId( "4fd66f9001e7fe9f03000065" ),
"type" : "checkin",
"date_time_created" : Date( 1339453328000 )},
{ "date_time_created" : Date( 1337351732000 ),
"date_time_updated" : Date( 1337351952635 ),
"id" : ObjectId( "4fb65e346d93b3fe77000000" )}
]
}
Run Code Online (Sandbox Code Playgroud)
我可以根据日期轻松查询这些文档:
User.where(
:activities => {
'$elemMatch' => {
:date_time_created => { '$gte' => start_date, '$lt' => end_date }
}
}
).length
Run Code Online (Sandbox Code Playgroud)
根据日志:
MOPED:127.0.0.1:27017 COMMAND database = db command = {:count =>"users",:query => {"activities"=> {"$ elemMatch"=> {"date_time_created"=> {"$ gte" …