2013-03-04 274 views
1

我想在MongoDB中使用以下功能。我有一个名为'实体'的集合,它基本上存储实体文本并且它是计数。该集合看起来像这样:

[{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) 

然而,这个查询只更新现有的实体计数和不推新实体

上任何想法

回答

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 } 

但是你的例子查询中,所以我假设你不使用$实际上是想:

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

,并期望它来更新或创建您通过每个_id值的条目。如果任何_id值已经存在,这将不起作用,因为upsert只会创建一个没有文档的新文档与搜索条件匹配。

+0

是的,我的错误。我已经更新了这个问题。请再次看看。但我不明白你的答案。 – VaidAbhishek 2013-03-04 10:21:20

+0

@VaidAbhishek在我的答案的后半部分已经做了;)那永远不会工作,因为这不是upsert的工作原理。要做你想做的事情,你必须遍历唯一的id并为每个id调用upsert = true更新。 – 2013-03-04 11:12:29

+0

谢谢你的时间。雅,我希望能避免它。但是,我仍然不确定它为什么不起作用。因为,upsert = True显然意味着对于每个处理过的文档(通过_id匹配),如果文档不存在,我的意图是插入它。我的意思是,如果它不能工作,那么我可能不会提供upsert选项,只处理multi = True。那么首先使用upsert选项是什么? – VaidAbhishek 2013-03-04 13:45:44