对象数组的MongoDB更新

时间:2013-08-26 08:15:00

标签: mongodb

我在mongodb中有以下文件

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

要求:

如果uuidsessionId不存在,我将按上述方式插入文档,否则我只需将对象推送到visits数组。

任何帮助都会很棒。

2 个答案:

答案 0 :(得分:8)

MongoDB支持update上的upsert选项,用于更新匹配文档(如果存在),并插入新文档(如果不存在)。在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

答案 1 :(得分: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而不是$ push