9

Mongoid(v3)を使用してMongoDBにアクセスしており、次のアクションを実行したいと思います。

db.sessionlogs.update( 
    {sessionid: '12345'}, /* selection criteria */
    {'$push':{rows: "new set of data"}},  /* modification */
    true /* upsert */
);

これはmongoシェルで正常に機能します。これは、私が頻繁に呼び出すことになるので、私にとって重要な単一の不可分操作であるため、まさに私が望んでいることでもあります。フェッチと更新の2つの操作を実行する必要はありません。私はmongoidを介してたくさんのことを試しましたが、それを機能させることができません。

どうすればMongoIDを邪魔にならないようにして、このコマンドをMongoDBに送信できますか?Mopedレベルでこれを行う方法があると思いますが、そのライブラリのドキュメントは基本的に存在しません。

4

3 に答える 3

10

[質問を書いているときに見つかった回答...]

criteria = Sessionlogs.collection.find(:sessionid => sessionid)
criteria.upsert("$push" => {"rows" => datarow})
于 2012-07-18T17:39:39.363 に答える
2

これを行う1つの方法は次のとおりです。

session_log = SessionLog.new(session_id: '12345')
session_log.upsert
session_log.push(:rows、 "新しいデータセット")

または別の:

SessionLog.find_or_create_by(session_id: '12345')。
  push(:rows、 "新しいデータセット")

#pushフィールドでアトミック$pushを実行します。これは、 AtomicPersistenceページで説明されてい ます。

(注:例では、Rubyの規則と同様に、UpperCamelCaseとsnake_caseを使用しています。)

于 2012-07-28T05:03:38.670 に答える
0

まだ原付に下がらないでください。検索と変更の操作を使用して、同じことを実現できます(すべてのデフォルトのスコープと継承機能を使用)

存在しない場合にグラフにエッジを保存するためのサンプル

edge = {source_id: session[:user_id],dest_id:product._id, name: edge_name}
ProductEdge.where(edge).find_and_modify(ProductEdge.new(edge).as_document,{upsert:true})
于 2014-01-04T19:36:51.027 に答える