используя ключ в качестве значения в Mongoengine - PullRequest
1 голос
/ 30 ноября 2011

Я использую mongoengine для mongodb в django.

но ... поля mongoengine (например, StringField) заставляют меня создавать схемы так, как мне не нужно. Я имею в виду, что он настаивает на том, чтобы я заранее написал имя ключа, прежде чем я узнаю, что это будет. например ...

на случай, если я не знаю, какое имя ключа будет занесено в базу данных ...

> for(var i=0; i<10; i++){
... o = {};
... o[i.toString()] = i + 100;
... db.test.save(o)
... }
> db.test.find()
{ "_id" : ObjectId("4ed623aa45c8729573313811"), "0" : 100 }
{ "_id" : ObjectId("4ed623aa45c8729573313812"), "1" : 101 }
{ "_id" : ObjectId("4ed623aa45c8729573313813"), "2" : 102 }
{ "_id" : ObjectId("4ed623aa45c8729573313814"), "3" : 103 }
{ "_id" : ObjectId("4ed623aa45c8729573313815"), "4" : 104 }
{ "_id" : ObjectId("4ed623aa45c8729573313816"), "5" : 105 }
{ "_id" : ObjectId("4ed623aa45c8729573313817"), "6" : 106 }
{ "_id" : ObjectId("4ed623aa45c8729573313818"), "7" : 107 }
{ "_id" : ObjectId("4ed623aa45c8729573313819"), "8" : 108 }
{ "_id" : ObjectId("4ed623aa45c872957331381a"), "9" : 109 }

[дополнение]

как вы можете видеть выше, клавиши сильно отличаются друг от друга .. просто предположим, что «я не знаю, какое имя ключа будет введено в документ в качестве ключа раньше времени»

как ответил dcrosta .. Я ищу способ использовать mongoengine без предварительного указания полей.

[/ сложение]

Как я могу сделать то же самое с помощью mongoengine? пожалуйста, дайте мне дизайн схемы, как

class Test(Document):
    tag = StringField(db_field='xxxx')

[дополнение]

Я не знаю, что будет "xxxx" в качестве имени ключа.

извините .. я кореец, поэтому мой английский неудобен. Пожалуйста, дайте мне свои знания. Спасибо, что прочитали это.

[/ сложения] * * тысяча двадцать пять

1 Ответ

2 голосов
/ 30 ноября 2011

Рассматривали ли вы использовать PyMongo напрямую вместо Mongoengine? Mongoengine разработан для объявления и проверки схемы для ваших документов и предоставляет множество инструментов и удобств для этого. Если ваши документы будут различаться, я не уверен, что Mongoengine - правильный выбор для вас.

Если, однако, у вас есть общие поля во всех документах, а затем у каждого документа есть определенный набор полей, свойственных ему, вы можете использовать Mongoengine's DictField. Недостатком этого является то, что ключи не будут «верхнего уровня», например:

class UserThings(Document):
    # you can look this document up by username
    username = StringField()

    # you can store whatever you want here
    things = DictField()

dcrosta_things = UserThings(username='dcrosta')
dcrosta_things.things['foo'] = 'bar'
dcrosta_things.things['bad'] = 'quack'
dcrosta_things.save()

Результаты в документе MongoDB, такие как:

{ _id: ObjectId(...),
  _types: ["UserThings"],
  _cls: "UserThings",
  username: "dcrosta",
  things: {
    foo: "bar",
    baz: "quack"
  }
}

Редактировать: Следует также отметить, что в настоящее время ведется работа над веткой разработки Mongoengine для "динамических" документов, где атрибуты в экземплярах документов Python будут сохраняться при сохранении модели. Подробности см. В https://github.com/hmarr/mongoengine/pull/112.

...