2015-10-03 91 views
1

我想在MongoDB中編寫一個查詢,以便在文檔中插入一個對象(如果它不存在),或者如果它存在於指定文檔中,則增加它的某個字段。有兩個查詢如下爲例:如何在一個MongoDB查詢中實現「插入或增量」?

文檔結構:

 Movies: 
    { 
     integer _id, 
     string Name, 
     array(object) WatchingList 
     [ 
      { 
       integer UserID, 
       integer WatchTimes 
      } 
      ..... 
     ] 
    } 

插入查詢:

db.Movies.update({_id:x}, {$push: {WatchingList:{UserID:y,WatchTimes:1}}}); 

增量查詢:

db.Movies.update({_id:x,"WatchingList.UserID":y},{$inc:{"WatchingList.$.WatchTimes":1}}); 

我怎樣才能將它們合併在一起成爲一個或多個查詢來達到要求?

+0

我可以看看你的文檔結構嗎?從我看到的情況來看,你已經失去了你的模型,我們應該在做其他事情之前糾正它。 –

+0

我已經添加了文檔結構,你可以看看。 –

+0

首先增加觀看時間,然後更新?我的意思是獲取觀看時間做+1,然後更新。 –

回答

0

從你的問題我的理解是,你需要兩個插入和更新時array.It通用的更新方法可以使用虛擬對象的數組作爲最後一個元素完成,在插入的情況下更新該元素。

我給這裏一個例子: 最初的虛擬對象添加到數組:

 > db.M4.update({_id:"id"},{"$addToSet":{WatchingList:{UserID:"Last",WatchTimes:0}}},true,true) 
     > db.M4.find() 
     { "_id" : "id", "WatchingList" : [ { "UserID" : "Last", "WatchTimes" : 0 } ] } 

//現在下面的查詢將同時處理插入和更新狀態:

 db.M4.update({_id:"id","WatchingList.UserID":{"$in":["p","Last"]}},{$inc:{"WatchingList.$.WatchTimes":1},"$set":{"WatchingList.$.UserID":"p"}}); 

記住運行每次更新statement.Or,你可以簡單地添加大量的虛擬對象的初步本身

+0

@IT_Layman能否請您解釋一下什麼是錯我的答案?我只是想知道我是否理解你的問題或不... –

+0

我很抱歉給你反饋這麼晚。其實我只是一個MongoDB初學者,並不完全理解你的答案。如果你能向我提供一個關於我的問題如何運作的例子,我將不勝感激。 –

+0

@IT_Layman感謝您的回覆。我的想法是在「WatchingList」數組中保留一個虛擬對象{「UserID」:「Last」,「WatchTimes」:0}並運行給定的單個更新查詢。如果UserId已經存在,那麼查詢將增加count否則它會插入一個新的用戶到array.Here只有一個查詢更新和插入,如果你有數組中的虛擬對象。如果你需要更多的澄清問我... –

0

好吧,首先,我認爲前第一僞此外你已經失去了你的模型。截止到撰寫本文時,BSON文檔的最大大小爲16MB。除非很少有人會觀看電影,否則這將是一個問題。

有了您的原始模型,你想要的是與$addToSet$inc使用的更新:

db.movies.update(
    { "_id": x }, 
    { $addToSet: 
    { "Watching.List": 
     { UserId: foo, "$inc":{ WatchTimes: 1 } } 
    } 
    } 
) 

免責聲明 我沒有測試過這一點,但它應該工作,因爲$ INC應該如果它不存在,則創建一個字段,並且$ addToSet應創建一個唯一的數組入口。

+0

我認爲你的關注是正確的,我決定在用戶​​中嵌入watchList字段文件。因此更新的文檔結構如下所示: –

+0

由於更改不會影響我所問的問題,因此我不需要編輯我的問題,也無需編輯您的答案。 –

+0

我剛試過,它不起作用。 $ inc在Mongo shell中顯示爲字段名稱。 –

相關問題