2013-08-26 54 views
3
我有在mongodb的下列文件

的阵列MongoDB的更新对象

{ 
    "_id" : ObjectId("521aff65e4b06121b688f076"), 
    "uuid" : "160597270101684", 
    sessionId" : "160597270101684.1", 
    "stamps" : 
      { 
      "currentVisit" : "1377500985", 
      "lastVisit" : "1377500985" 
    }, 
    visits : [ 
      { 
      "page":"google.com", 
      "method": "GET" 
      } 
      ] 
} 

要求:

如果uuidsessionId不存在我将插入文档如上否则我有推只有对象为visits数组。

任何帮助将是伟大的。

回答

8

MongoDB的支持上updateupsert选项更新匹配文件是否存在,如果不存在则插入新文件。在MongoDB 2.4+中,如果upsert执行插入操作,则可以使用$setOnInsert运算符进一步调整此设置以设置某些字段而不是

db.test.update({ 
    uuid: "160597270101684", 
    sessionId: "160597270101684.1" 
    }, { 
    $setOnInsert: { 
     stamps: { 
     currentVisit: "1377500985", 
     lastVisit: "1377500985" 
     } 
    }, 
    $push:{ 
     visits: { 
     page: "google.com", 
     method: "GET" 
     } 
    } 
    }, { upsert:true }) 

所以在上面的例子中,$pushvisits总是会发生,但$setOnInsertstamps如果匹配的文件不存在时才会发生。

+0

即使没有明确提到,看来邮票每次都会更新,因为它包含有关当前和上次访问的数据。 –

+0

非常感谢 – karthick

2

您可以通过以下UPSERT查询实现这一目标:

db.session.update({"uuid" : "160597270101684", sessionId : "160597270101684.1"}, 
{$set:"stamps" :{"currentVisit" : "1377500985","lastVisit" : "1377500985"}}, 
$push :{visits:{"page":"yahoo.com","method": "POST"}}}, 
{upsert:true}) 

你可以用$代替$ addToSet如果你想避免重复