3

我在 mongodb 中有以下文档

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

要求:

如果uuid并且sessionId不存在,我将如上所述插入文档,否则我必须仅将对象推送到visits数组。

任何帮助都会非常有用。

4

2 回答 2

8

MongoDB 支持一个upsert选项update,如果匹配文档存在则更新它,如果它不存在则插入一个新文档。在 MongoDB 2.4+ 中,您可以使用$setOnInsert运算符进一步调整它以在 upsert 执行插入时设置某些字段。

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

所以在上面的例子中,$pushtovisits总是会出现,但只有当匹配的文档不存在时才会出现$setOnInsertstamps

于 2013-09-07T01:31:30.847 回答
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

于 2013-09-06T09:45:05.977 回答