2

私はMongoDBで作成したいかなり単純なデータベース構造を持っています。私の構造は次のようになります。

    {url: value,
     users: {user_id: value}}

サンプルドキュメントは次のようになります。

{'url': 'http://stackoverflow.com/', users: {'billy': 12, 'tommy': 2}}

上記のように、PyMongoを使用してデータベースを更新し、ドキュメントを追加しています。データベースにデータを正常に追加できますが、上記のデータ構造を複製できないようです。

    for d in data:
        foo.update(
            {'id': d.get('url')}, 
            {'$addToSet' :{'users': {d.get('user'): 'NaN'}}},
            upsert=True)

上記のコードは挿入されますが、「user」構造は私が意図したものではありません。をお願いします:

users: {'billy': 'NaN', 'tommy': 'NaN'}

そして私は得る:

users : [ { 'billy' : "NaN" }, { 'tommy' : "NaN" } ]

誰か助けてもらえますか?御時間ありがとうございます。

4

2 に答える 2

2

上記の私のコメントによると、ドキュメントを埋め込むのではなく、配列を使用することをお勧めします。以下はうまくいくでしょう:

{'url': 'http://stackoverflow.com/', 
 'users': [{'user': 'billy', 'value': 12},
           {'user': 'tommy', 'value': 2}}

$pushこのようにして、$pullなどを活用することができます$addToSet。後者の場合、次のような新しいユーザーを追加できます。

foo.update({'url': d.get('url')}, {'$addToSet': {'users': {'user': 'john', 'value': 0}}})

ここで、特定のユーザーの値をインクリメントしたいとします。これも簡単に実行できます。

foo.update({'url': d.get('url'), 'users.user': 'tommy'}, {'$inc': {'users.$.value': 1}})

私が提案したスキーマでできることをもっと見るために、私はこれを読みます

于 2012-05-23T23:32:59.033 に答える
0

mongoについてはよくわかりませんが$addToSet、代わりにユーザーオブジェクトにキーを追加する必要があると思われる場合は、ユーザーのコレクションがあることをお勧めします。

アップサートの例でこれへのmongoショートカットがあるかどうかはわかりません

foo['users']['billy'] = 'NaN'

于 2012-05-23T23:13:58.053 に答える