2014-06-10 8 views
5

używam pymongo do materiału siewnego bazę danych ze starych informacji z innego systemu, a mam dużo zapytań takiego:Konfiguracja pymongo użyć ciąg _id zamiast objectID

studentId = studentsRemote.insert({'price': price}) 

w rzeczywistej pytona skrypt, który studentId drukuje jako ciąg znaków, ale w aplikacji Meteor javascript używam tych danych, pojawia się wszędzie jako ObjectId(...).

Chcę skonfigurować pymongo wygenerować _id jako ciąg znaków, a nie męczyć się z objectID za

żadnych przedmiotów tworzę ze specyfikacją Meteor będzie wykorzystywał format ciągu, a nie format ObjectId. Nie chcę mieszać typów identyfikatorów w mojej aplikacji, ponieważ powoduje to u mnie problemy z interoperacyjnością.

Jestem świadomy, że mogę create ObjectId's from Meteor, ale szczerze mówiąc wolałbym raczej użyć formatu ciągu. Jest to domyślny Meteor, znacznie prostszy i I can't find any good reason to use ObjectId's in my particular app.

The valueOf() mongo function lub coś podobnego można przeanalizować _id i być używane do aktualizacji dokumentu, gdy jest w bazie danych, ale byłoby miło mieć coś bardziej bezpośredniego.

Odpowiedz

3

Okazało się dość proste.

Za pomocą son_manipulator module można zmienić przychodzące dokumenty na inny. Przez większość czasu this is used to encode custom objects, ale działało również na to.

Przy pomocy manipulatora w miejscu, było tylko kwestią calling the str() function on the ObjectId, aby dokonać transformacji.

from pymongo.son_manipulator import SONManipulator 
class ObjectIdManipulator(SONManipulator): 
    def transform_incoming(self, son, collection): 
     son[u'_id'] = str(son[u'_id'])  
     return son 

db.add_son_manipulator(ObjectIdManipulator()) 
+1

Wygląda na to, że add_son_manipulator() jest teraz przestarzałe. Mam problem ze znalezieniem odpowiedniej alternatywy. Czy ktoś ma jakieś pomysły? Wydaje się, że i tak nie działa w Pythonie 2.7.10. Dodałem punkt przerwania i instrukcję print wewnątrz metody transform_incoming(), której kod nigdy nie osiąga. –

4

w plikach .py:

from bson.objectid import ObjectId 
...... 
kvdict['_id'] = str(ObjectId()) 
...... 
mongoCollection.insert(kvdict) 

jest ok!

+0

To działa ... dodając _id do dyktatora, zmusza mongo do użycia tego _id, a nie domyślnego ObjectId() – Izack

Powiązane problemy