2

MongoDB で次の機能が必要です。「entities」という名前のコレクションがあります。これは基本的にエンティティ テキストを格納し、カウントします。コレクションは次のようになります。

[{u'_id': u'facebook', u'n': 120},
 {u'_id': u'florida', u'n': 98},
 {u'_id': u'vegas', u'n': 94},
 {u'_id': u'andrew_mason', u'n': 93},
 {u'_id': u'obama', u'n': 85},
 {u'_id': u'twitter', u'n': 81},
 {u'_id': u'outlook', u'n': 81},
 {u'_id': u'delhi', u'n': 75},
 {u'_id': u'google', u'n': 74},
 {u'_id': u'virginia', u'n': 71}]

ここで、このコレクションを新しいエンティティで更新したいと思います。基本的に、次のような配列で新しいエンティティを用意します。

entitySet = ['google', 'Abhishek_Vaid', 'andrew_mason']

私の意図は、すでにコレクションに含まれているエンティティの数を更新する必要があるということです。コレクションにないエンティティについては、そのカウントを 1 に初期化する必要があります。単一の MongoDB クエリを使用して、これらの両方の効果を達成したいと考えています。これまで、次のクエリを見つけることができました: (これは PyMongo フレーバーですが、それでも MongoDB クエリです)

ENTITY_DB_HANDLE.entities.update (

{'_id' : {'$in' : entitySet} }, {'$inc' : {'n' : 1} }, upsert=True, multi=True )

ただし、このクエリは既存のエンティティ数を更新するだけで、新しいエンティティをプッシュしません。

これに関するアイデアはありますか?

4

1 に答える 1

2

確かに機能します:

> db.test.save({_id:"a", n:3})
> db.test.update({_id:"b"}, {$inc:{n:1}}, true, false)
> db.test.find()
{ "_id" : "a", "n" : 3 }
{ "_id" : "b", "n" : 1 }

しかし、あなたのサンプルクエリは$ inを使用していないので、実際に試していると思います:

{'_id' : {$in:['google', 'Abhishek_Vaid', 'andrew_mason']}, {'$inc' : {'n' : 1} }, upsert=True, multi=True )

渡す_id値ごとにエントリが更新または作成されることを期待します。upsertは検索条件に一致するドキュメントがない新しいドキュメントのみを作成するため、_id値のいずれかがすでに存在する場合、これは機能しません。

于 2013-03-04T09:53:19.210 に答える