1

私はdjangoのmongodbにmongoengineを使用しています。

しかし、.. 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

Mongoengine を使用する代わりに、PyMongo を直接使用することを検討しましたか? 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 に答える