php

2010-12-13 6 views
11

के साथ अपरिवर्तित करने के बाद mongodb _id ऑब्जेक्ट प्राप्त करें क्वेरी के बाद नया/अपडेट किया गया _id प्राप्त करना संभव है? उदाहरण कोड:php

$key = array('something' => 'unique'); 
$data = array('$inc' => array('someint' => 1)); 
$mongodb->db->collection->update($key, $data, array('upsert' => true)); 

$ कुंजी नए/पुराने _ id वस्तु धारण नहीं कर रहा है और मैं मान लेते हैं कि $ डेटा या तो नहीं होगा क्योंकि इसकी सिर्फ एक अनुदेश।

उत्तर

16

हाँ - यह एक प्रश्न का उपयोग करना संभव है।

मोंगोडीबी में findAndModify कमांड शामिल है जो परमाणु रूप से एक दस्तावेज़ को संशोधित कर सकता है और इसे वापस कर सकता है (डिफ़ॉल्ट रूप से यह वास्तव में संशोधित होने से पहले दस्तावेज़ को वापस कर देता है)।

PHP ड्राइवरों में संग्रह वर्ग पर इसके लिए एक सुविधाजनक विधि शामिल नहीं है (अभी तक - this bug देखें), लेकिन इसका अभी भी उपयोग किया जा सकता है (ध्यान दें कि मेरा PHP भयानक है, इसलिए मैं बहुत अच्छी तरह से बना सकता हूं निम्नलिखित स्निपेट में एक सिंटैक्स त्रुटि):

$key = array('something' => 'unique'); 
$data = array('$inc' => array('someint' => 1)); 
$result = $mongodb->db->command(array(
    'findAndModify' => 'collection', 
    'query' => $key, 
    'update' => $data, 
    'new' => true,  # To get back the document after the upsert 
    'upsert' => true, 
    'fields' => array('_id' => 1) # Only return _id field 
)); 
$id = $result['value']['_id']; 
+0

आह - 'findAndModify' मैं तो शायद ही कभी इसका इस्तेमाल मैं हमेशा यह भूल जाते हैं मौजूद है :) - कभी-कभी गलत साबित होना अच्छा होता है;) – gnarf

+0

@gnarf: कोई चिंता नहीं।मुझे अजीब बात यह है कि PHP में स्वचालित रूप से _id प्राप्त करने का कोई तरीका नहीं है - मुझे पाइथन ड्राइवरों में उपयोग किया जाता है जो प्रत्येक [अपरर्ट] पर _id वापस लौटाते हैं (http://api.mongodb.org/ पायथन/1.9% 2 बी/एपीआई/पिमोंगो/संग्रह.html # pymongo.collection.Collection.save) – Cameron

15

शायद ज़रुरत पड़े कोई इस सवाल की तरह मैंने किया था भर में ठोकर, मोंगो वास्तव में इनपुट सरणी को संशोधित करेगा जब आप (बचाने फोन MongoCollection->); - आईडी को अंत में जोड़ना। इसलिए, यदि आप कहते हैं:

$test = array('test'=>'testing'); 
mongocollection->save($test); 
echo $test['_id']; 

आप उस वस्तु के लिए मोंगो आईडी होगा।

+3

मुझे पता है कि यह 'insert()' फ़ंक्शन पर भी काम करता है। – Failpunk

+1

शानदार। यदि पारंपरिक, कोई फ्रिल्स, 'अपरर्ट' नहीं है, तो पारंपरिक 'सेव' की बजाय अत्यधिक जटिल 'ढूंढें और संशोधित करें' का उपयोग करने में मुझे कोई उद्देश्य नहीं दिख सकता है। – Nucleon

+0

आह! मैं सोच रहा था कि क्यों PHP में अपरिवर्तित करने के लिए '_id' प्राप्त करने का कोई तरीका नहीं था ... यह स्वीकार्य उत्तर होना चाहिए। – Cameron

1

अपडेट को पास किए गए ऑब्जेक्ट में _id वापस लौटने के लिए, आप अपडेट/अपरर्ट में सत्य में fsync भी सेट कर सकते हैं।

$save = array ('test' => 'work'); 
$m->$collection->update(criteria, $save, array('fsync' => true, 'upsert' => true)); 
echo $save['_id']; //should have your _id of the obj just updated. 
+1

ऐसा लगता है कि यह काम नहीं करता है। – Oleg

3

मैं इस मुद्दे में भाग गया और अपर के बाद _id को वापस पूछकर इसके आसपास काम किया। मैंने सोचा कि अगर मैं जानकारी के लिए यहां आने वाले किसी भी व्यक्ति के लिए उपयोगी हूं तो मैं अपने कुछ निष्कर्ष जोड़ दूंगा।

Array 

(

[updatedExisting] => 0 

[upserted] => MongoId Object 
    (
     [$id] => 506dc50614c11c6ebdbc39bc 
    ) 

[n] => 1 
[connectionId] => 275 
[fsyncFiles] => 7 
[err] => 
[ok] => 1 
) 

आप इस से _ id प्राप्त कर सकते हैं:

जब एक नया दस्तावेज़ में Upsert परिणाम संग्रह में बनाया जा रहा है, लौटे वस्तु _ id (यहाँ एक उदाहरण के एक print_r है) शामिल हैं

$id = (string)$obj['upserted']; 

हालांकि, अगर अपरर्ट के परिणामस्वरूप मौजूदा दस्तावेज़ अपडेट हो रहा है तो लौटाई गई वस्तु में _id नहीं है।

1

इस एक शॉट दे दो:

function save($data, $id = null) { 
    $mongo_id = new MongoId($id); 
    $criteria = array('_id' => $mongo_id); 
    // Wrap a '$set' around the passed data array for convenience 
    $update = array('$set' => $data); 
    $collection->update($criteria, $update, array('upsert' => true)); 
} 

तो कहते हैं कि पारित कर दिया $id रिक्त है, एक ताजा MongoId बनाई गई है की सुविधा देता है, अन्यथा यह सिर्फ एक MongoId वस्तु को मौजूदा $id बदल देता है।

आशा इस मदद करता है: डी

1

अद्यतन विधि दस्तावेज़ UPSERTED की आईडी के साथ एक सरणी देता है:

Array 
(
    [ok] => 1 
    [nModified] => 0 
    [n] => 1 
    [err] => 
    [errmsg] => 
    [upserted] => MongoId Object 
     (
      [$id] => 5511da18c8318aa1701881dd 
     ) 
    [updatedExisting] => 
)