1

我在 django 中将 mongoengine 用于 mongodb。

但是.. 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' 将作为键名。

对不起..我是韩国人,所以我的英语很尴尬。请给我一些知识。感谢您阅读本文。

[/添加]

4

1 回答 1

2

您是否考虑过直接使用 PyMongo 而不是使用 Mongoengine?Mongoengine 旨在为您的文档声明和验证模式,并提供许多工具和便利。如果您的文档会有所不同,我不确定 Mongoengine 是否适合您。

但是,如果您在所有文档中都有一些共同的字段,然后每个文档都有一些特定于自身的字段,您可以使用 Mongoengine 的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

于 2011-11-30T13:54:15.347 回答