2012-07-18 16 views
9

मैं MongoDB तक पहुँचने के लिए Mongoid (v3) का उपयोग कर रहा है, और इस काम करवाना चाहते हैं के साथ एक Upsert/धक्का कैसे करना है:mongoid/मोपेड

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

यह मोंगो खोल में ठीक काम करता है। यह वही है जो मैं चाहता हूं क्योंकि यह एक परमाणु ऑपरेशन है जो मेरे लिए महत्वपूर्ण है क्योंकि मैं इसे बहुत बुला रहा हूं। मैं दो संचालन नहीं करना चाहता - एक लाने और फिर एक अद्यतन। मैंने मोंगोइड के माध्यम से चीजों का एक गुच्छा करने की कोशिश की है, लेकिन इसे काम पर नहीं लाया जा सकता है।

मैं मोंगोइड को रास्ते से कैसे निकाल सकता हूं और बस यह आदेश MongoDB को भेज सकता हूं? मुझे लगता है कि मोपेड स्तर पर ऐसा करने का कोई तरीका है, लेकिन उस पुस्तकालय का दस्तावेज मूल रूप से अस्तित्व में नहीं है।

+1

आप [इंजन से साइकिल चालक डॉक्स] देखा (http://mongoid.org/en/moped/docs/ driver.html)? –

उत्तर

10

[उत्तर पाया, जबकि ... प्रश्न लिखने]

criteria = Sessionlogs.collection.find(:sessionid => sessionid) 
criteria.upsert("$push" => {"rows" => datarow}) 
2

यहाँ एक तरह से यह करने के लिए है:

 
session_log = SessionLog.new(session_id: '12345') 
session_log.upsert 
session_log.push(:rows, "new set of data") 

या किसी अन्य:

 
SessionLog.find_or_create_by(session_id: '12345'). 
    push(:rows, "new set of data") 

#push एक प्रदर्शन मैदान पर परमाणु $push। यह Atomic Persistence पृष्ठ पर समझाया गया है।

(नोट: उदाहरण UpperCamelCase का उपयोग करें और snake_case के रूप में रूबी सम्मेलन है।)

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})