MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Memperbarui Referensi Bersama Dengan Nilai Lain Luwak

Data di sini terdapat dalam koleksi yang berbeda, jadi tidak ada pernyataan pembaruan tunggal yang dapat menambah penghitung di keduanya secara bersamaan.

Untuk mendapatkan tampilan yang konsisten, Anda perlu "merantai" pernyataan pembaruan dan menggunakan hasil pengembalian masing-masing untuk membangun respons.

Tergantung pada kebutuhan Anda, Anda dapat menggunakan Promise dengan ini:

testSchema.statics.incrementTest = function(id) {
  var self = this;
  return new Promise(function(resolve,reject) {
    self.findByIdAndUpdate(
      id,
      {
        "$inc": {
          "points": 5,
          "numVotes": 1
        }
      },
      { "new": true }
    ).then(function(test) {
      var userModel = test.schema.path("userCreated").options.ref;
      mongoose.model(userModel).findByIdAndUpdate(
        test.userCreated,
        { "$inc": { "points": 5 } },
        { "new": true }
      ).then(function(user) {
        test.userCreated = user;
        resolve(test);
      })
    }).catch(reject)
  })
};

Yang kemudian dapat Anda panggil pada model Anda:

Test.incrementTest("56fe279d363ce91765d9e39e").then(function(test) {
    console.log(JSON.stringify(test,undefined,2));
}).catch(function(err) {
    throw err;
})

Atau Anda dapat menggunakan async.waterfall dari async perpustakaan jika itu lebih cocok untuk Anda:

testSchema.statics.incrementTest = function(id,callback) {
  var self = this;

  async.waterfall(
    [
      function(callback) {
        self.findByIdAndUpdate(
          id,
          { 
            "$inc": {
              "points": 5,
              "numVotes": 1
            }
          },
          { "new": true },
          callback
        )
      },
      function(err,test) {
        if (err) callback(err);
        var userModel = test.schema.path("userCreated").options.ref;
        mongoose.model(userModel).findByIdAndUpdate(
          test.userCreated,
          { "$inc": { "points": 5 } },
          { "new": true },
          function(err,user) {
            if ( typeof(user) !== "undefined" )
                test.userCreated = user;
            callback(err,test);
          }
        );
      }
    ],
    callback
  );
};

Yang memiliki penggunaan serupa:

Test.incrementTest("56fe279d363ce91765d9e39e",function(err,test) {
    if (err) throw err;
    console.log(JSON.stringify(test,undefined,2));
})

Keduanya akan memberi Anda hasil yang menunjukkan data yang bertambah di kedua objek untuk kedua koleksi:

{ points: 5,
  numVotes: 1,
  __v: 0,
  userCreated: { points: 5, __v: 0, _id: 56ff1aa6dba6d13e798fc894 },
  createdAt: Sat Apr 02 2016 12:04:38 GMT+1100 (AEDT),
  updatedAt: Sat Apr 02 2016 12:04:38 GMT+1100 (AEDT),
  _id: 56fe279d363ce91765d9e39e }



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB:Bagaimana cara memperbarui banyak dokumen dengan satu perintah?

  2. Apakah klausa $in MongoDB menjamin pesanan?

  3. Bagaimana cara membatalkan kueri di mongo JavaScript shell?

  4. 9 Fitur ClusterControl yang Tidak Akan Anda Temukan di Alat Manajemen Basis Data Lainnya

  5. Bagaimana cara memeriksa apakah dokumen dimasukkan atau diperbarui saat menggunakan findOneAndUpdate?