我想在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 )
但是,此查询仅更新现有实体计数,并且不会推送新实体。
有关于此的任何想法吗?
答案 0 :(得分:1)
当然可行:
> 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值更新或创建条目。如果任何_id值已经存在,这将不起作用,因为upsert只会创建一个没有符合搜索条件的文档的新文档。