2012-09-12 11 views
12

मेरा बैकबोन ऐप मोंगोडीबी के शीर्ष पर बने एक आरईएसटी एपीआई के साथ संचार कर रहा है, इसलिए मेरी ऑब्जेक्ट्स 'प्राकृतिक "आईडी वास्तव में MongoIDs हैं। जब JSON में श्रृंखलाबद्ध, वे की तरह लग रहे:बैकबोन और मोंगोडीबी के आईडी कैसे काम करते हैं?

"_id":{"$id":"505099e998dee4db11000001"} 

Backbone documentation कहा गया है कि आप अपनी रीढ़ मॉडल की आईडी गुण के लिए id (idAttribute का प्रयोग करके) की तुलना में एक और नाम निर्दिष्ट कर सकते हैं, हालांकि, के रूप में MongoIDs 'स्ट्रिंग अभ्यावेदन नेस्टेड रहते हैं, बस का उपयोग कर idAttribute: '_id' सीधे जेएसओएन उपभोग करने में मदद नहीं करता है।

क्या सर्वर के पक्ष में पुनः लिखने वाले गुणों के अलावा, इसके आसपास कोई तरीका है?

अद्यतन:

यहाँ मैं सर्वर साइड क्या कर रहा है:

$m = new Mongo(); 
$posts = $m->mydatabase->posts->find(); 

$out = array(); 

foreach ($posts as $post) { 
    $out[] = $post; 
} 

echo json_encode($out); 

मैं जानता हूँ कि मैं $post['id'] = (string) $post['_id']; unset($post['_id']); की तरह कुछ कर सकता है, लेकिन यह ठीक है कि मैं क्या से बचने के लिए देख रहा हूँ है!

+0

वे कैसे घोंसले हैं? –

+0

@AronWoost '" _id ": {" $ id ":" 505099e998dee4db11000001 "}' (JSONDB से ऑब्जेक्ट जेएसओएन एन्कोडिंग) –

+0

आपका आरईएसटी एपीआई क्या है? क्लाइंट को भेजने से पहले आप इसे सरल रूप से बदल सकते हैं और ऑब्जेक्टिड कैसे बदल सकते हैं। –

उत्तर

16

यह parse() के लिए एक अच्छा उदाहरण की तरह लगता है।

"_id":{"$id":"505099e998dee4db11000001"} 

क्यों रीढ़ का उपयोग नहीं पार्स ठीक से आने वाले डेटा नाम स्थान के लिए:

अपने मोंगो JSON के बाद से भेजने के समाप्त होता है?

parse: function(response) { 
    response.id = response._id['$id']; 
    delete response._id; 

    return response; 
} 

या ऐसा कुछ। इसी प्रकार, चूंकि बैकबोन आईडी को 'आईडी' के साथ जेएसओएन के रूप में भेज देगा, तो आपका सर्वर इसे ले सकता है और इसे दूसरे तरीके से "अनुवाद" कर सकता है।

आप एक अलग id attribute, _id उपयोग करना चाहते हैं, तो आप सिर्फ इस कोड के साथ ऊपर पार्स की जगह लेंगे:

idAttribute: '_id', 

parse: function(response) { 
    response._id = response._id['$id']; 

    return response; 
} 

जो कुछ भी आपके लिए सबसे अच्छा काम करता है। :-)

+0

आपको सर्वर के इनपुट के रूप में क्या देखने की उम्मीद है, इसके आधार पर आपको ['toJSON'] (http://backbonejs.org/#Model-toJSON) के साथ कुछ भी करने की आवश्यकता हो सकती है। –

+0

बात यह है कि मैं क्लाइंट-साइड और सर्वर-दोनों दोनों डेटा को "अनुवाद" करने से बचना चाहता हूं! मुझे आश्चर्य है कि ऐसा करने का कोई आसान तरीका नहीं है, विशेष रूप से बैकबोन दस्तावेज़ मोंगोडीबी के लिए 'idAttribute' का उपयोग करने का उल्लेख करता है। क्या यह हो सकता है कि कुछ भाषाओं में मोंगोइड्स को जेएसओएन को गैर-घोंसले तारों के रूप में एन्कोड किया जाए? (मैं PHP का उपयोग कर रहा हूँ) –

+0

आपके सर्वर की क्या अपेक्षा है? – jmk2142

0

रूबी में मैं निम्न करने में समर्थ हूँ:

 
items.find.to_a.map do |item| 
    frombsonid(item) 
end.to_json 

def frombsonid(obj) obj.merge({'_id' => obj['_id'].to_s}) end 

और जब आप डेटा वापस पाने के लिए, आप BSON को स्ट्रिंग परिवर्तित कर सकते हैं :: ObjectId

def tobsonid(id) BSON::ObjectId.fromstring(id) end 

तो विचार BSON की एक स्ट्रिंग संस्करण के साथ प्रत्येक मद में _ id को बदलने के लिए है :: ObjectId

रीढ़ की हड्डी में आप जोड़ सकते हैं

idAttribute: "_id", 

PHP में आप विभिन्न वाक्यविन्यास और विधियों का उपयोग करेंगे, लेकिन मेरा मानना ​​है कि इसे दोहराना संभव है।

3

विभिन्न सुझाए गए विकल्पों को देखते हुए मुझे लगता है कि आप जो करना चाहते हैं, वह करना सबसे आसान होगा।(पार्स का उपयोग करते हुए, हालांकि काम करता है)

$m = new Mongo(); 
$posts = $m->mydatabase->posts->find(); 

$out = array(); 

foreach ($posts as $post) { 
    // populate an id field 
    $post['id']=$post['_id']->{'$id'}, 
    $out[] = $post; 
} 

echo json_encode($out); 

$post['_id'] रखते हुए अगर आप अपने मॉडल चाहते हैं जब सिंक कर रहा है इसे वापस भेजने के लिए। मैं एपीआई को सही करना पसंद करता हूं क्योंकि अधिक ग्राहक इसे कनेक्ट करना चाहते हैं।

5

ब्राउज़र में रूपांतरण करना बेहतर है ताकि आप सर्वर से गणना को बंद कर सकें। तो आप बेस मोंगोमोडेल बनाना चाहते हैं, और फिर आप बैकबोन के बजाय मोंगोमोडेल से विस्तार कर सकते हैं। मॉडल।

MongoModel = Backbone.Model.extend({ 
    // this handle conversion between the mongo's _id and backbone id 
    // this is best done on the client side to alleviate server load 
    //_id : { "$oid" : ... } <--> id 
    parse : function (response) { 
     response.id = response._id.$oid; 
     delete response._id; 
     return response; 
    }, 
    toJSON : function() { 
     var 
      json = Backbone.Model.prototype.toJSON.apply(this); 
     json._id = {'$oid':json.id}; 
     delete json.id; 
     return json; 
    } 
}); 
0

आपका PHP कोड REST API कि रीढ़, के साथ बातचीत करेंगे ताकि यह सरल id स्ट्रिंग आप देख रहे हैं करने के लिए मोंगो के जटिल _id संपत्ति की अमूर्त संभाल चाहिए। यह निश्चित रूप से एपीआई का काम है।

बैकबोन, या आपके एपीआई के किसी अन्य उपभोक्ता को मोंगो या _id के बारे में कुछ भी नहीं पता होना चाहिए।

क्यों? क्योंकि यदि आप मोंगो से किसी अन्य डीबी में स्विच करना चाहते हैं, जहां _id नहीं है, तो आपका एपीआई अभी भी अच्छा है क्योंकि जो भी खुलासा हुआ था वह id था, जो सुपर जेनेरिक है। तो आप मूल विचार वास्तव में सबसे अच्छा विचार थे (हालांकि आप कोड के टुकड़े को उस चीज़ में अमूर्त करना चाहते हैं जिसे सभी मॉडलों के लिए पुन: उपयोग किया जा सकता है, केवल पोस्ट नहीं)।

संबंधित मुद्दे