2
var urlSchema = new Schema ( {
url : String,
visitor : [{name: String,date: Date}],
counter : Number
});

var url = mongoose.model('url',urlSchema);
var domain = blah blah;
var conditions = { url: domain };
var update = { $inc : {counter:1},
              $push : { visitor: [{
                  name: data.username,
                  date: new Date()
                  }]
              }
             };
var options = {upsert: true};
url.update(conditions,update,options,function(err){
if(err){
  console.log(err);
}else{
  console.log('A domain successfully added to DB');
}

現在、上記のスキーマとコードを使用して、各ページのアクセス カウンターを作成しています。これは、合計アクセス数をカウントし、アクセス ユーザー情報を保持している URL ドキュメントをアップサートします。これまでのところとても良い 正常に動作しています。

今、私は訪問者の配列に「カウンター:番号」を追加したいのですが、イベントが発生したときに、ユーザーがすでに訪問者の配列にいる場合は、新しいものをプッシュする代わりにそれを更新したいと考えています。しかし、「ダブル アップサート」コマンドの作成方法がわかりません。とにかくそれをすることはありますか?

4

1 に答える 1

0

条件を満たすクエリを実行するのは少し難しいかもしれませんし、不可能かもしれません。次のクエリでシナリオを再現しました

url.findOne({'url': 'search.php', 'visitor.name': "JohnDoe"},
    function (err, visitor) {
        if (visitor) {
            url.update(
                {
                    'url': 'search.php', 'visitor.name': "JohnDoe"
                },
                {
                    $inc: {'visitor.$.counter': 1, 'counter': 1}
                },
                function(err, result) {
                    if (err) {
                        console.log("Error occured")
                    } else {
                        console.log("Success");
                    }

                });
        } else {
            var conditions = { url: 'search.php' };
            var update = { $inc : {counter:1},
                $push : { visitor: [{
                    name: data.username,
                    date: new Date(),
                    counter: 0
                }]
                }
            };
            var options = {upsert: true};
            url.update(conditions,update,options,function(err){
                if(err){
                    console.log(err);
                }else{
                    console.log('A domain successfully added to DB');
                }
            });
        }
    }
);

シンプル、カウンター = 0 で存在しない場合は挿入、存在する場合はカウンターを 1 ずつインクリメントして更新

于 2013-12-24T07:17:31.360 に答える