3

私はmongodbに次の文書を持っています

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

要件:

uuidandが存在しない場合sessionIdは、上記のようにドキュメントを挿入します。それ以外の場合は、オブジェクトのみをvisits配列にプッシュする必要があります。

どんな助けも大いに役立ちます。

4

2 に答える 2

8

MongoDB は、一致するドキュメントが存在する場合はそれを更新し、存在しない場合は新しいドキュメントを挿入するupsertオプションをサポートしています。updateMongoDB 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 })

したがって、上記の例では、$pushtovisitsは常に発生しますが、$setOnInserttostampsは一致するドキュメントがまだ存在しない場合にのみ発生します。

于 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})

重複を避けたい場合は、$push の代わりに $addToSet を使用できます。

于 2013-09-06T09:45:05.977 に答える