2013-03-04 273 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