2015-10-03 90 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中显示为字段名称。 –

相关问题