2015-02-06 26 views
11

Theo this mongodb article có thể tự động tăng một trường và tôi muốn sử dụng cách thu thập bộ đếm.Mongoose tự động tăng

Vấn đề với ví dụ đó là tôi không có hàng nghìn người đang nhập dữ liệu trong cơ sở dữ liệu bằng bảng điều khiển mongo. Thay vào đó tôi đang cố gắng sử dụng mongoose.

Vì vậy schema của tôi trông giống như sau:

var entitySchema = mongoose.Schema({ 
    testvalue:{type:String,default:function getNextSequence() { 
     console.log('what is this:',mongoose);//this is mongoose 
     var ret = db.counters.findAndModify({ 
       query: { _id:'entityId' }, 
       update: { $inc: { seq: 1 } }, 
       new: true 
       } 
     ); 
     return ret.seq; 
     } 
    } 
}); 

Tôi đã tạo ra bộ sưu tập quầy trong cơ sở dữ liệu tương tự và thêm một trang với _id của 'ENTITYID'. Từ đây tôi không chắc chắn làm thế nào để sử dụng mongoose để cập nhật trang đó và nhận được số gia tăng.

Không có lược đồ cho bộ đếm và tôi muốn nó theo cách đó vì đây không thực sự là một thực thể được ứng dụng sử dụng. Nó chỉ nên được sử dụng trong lược đồ (s) để tự động tăng trường.

+1

Giá trị mặc định của giản đồ không được đồng bộ hóa nên điều này sẽ không hoạt động. Nếu bạn tìm kiếm "tăng tự động" trong trang mongoose [plugins] (http://plugins.mongoosejs.com/) bạn sẽ tìm thấy một số tùy chọn. – JohnnyHK

+0

@JohnnyHK Cảm ơn bạn đã trả lời. Các plugin làm việc trên sự kiện cập nhật và là một cái gì đó tôi muốn tránh, tìm kiếm tăng tự động đã cho tôi để các bài viết mongodb ở nơi đầu tiên và npm cài đặt plugin cho mongoose mà dường như là sự kiện dựa. – HMR

+0

Bạn có thể cho tôi biết cách tiếp cận nào bạn đã sử dụng không? và cũng có khi có nhiều yêu cầu đồng thời thì giải pháp của bạn xử lý như thế nào ?? –

Trả lời

27

Dưới đây là một ví dụ làm thế nào bạn có thể thực hiện lĩnh vực tự động tăng trong Mongoose:

var CounterSchema = Schema({ 
    _id: {type: String, required: true}, 
    seq: { type: Number, default: 0 } 
}); 
var counter = mongoose.model('counter', CounterSchema); 

var entitySchema = mongoose.Schema({ 
    testvalue: {type: String} 
}); 

entitySchema.pre('save', function(next) { 
    var doc = this; 
    counter.findByIdAndUpdate({_id: 'entityId'}, {$inc: { seq: 1} }, function(error, counter) { 
     if(error) 
      return next(error); 
     doc.testvalue = counter.seq; 
     next(); 
    }); 
}); 
+0

Tôi có thể đặt đối tượng nàySchema.pre ('save', gọi lại) ở đâu; nếu tôi có từng mô hình của mình trong các tệp riêng biệt trong một thư mục mô hình? –

+1

Bạn có thể đặt nó ngay sau khi khai báo Lược đồ, trong cùng một tệp – edtech

+0

Đây không phải là giải pháp bằng chứng lừa khi nói đến yêu cầu đồng thời - có thể yêu cầu được thực hiện rất chặt chẽ với nhau sẽ có cùng số trong chuỗi " – realisation

24

Bạn có thể sử dụng mongoose-auto-increment gói như sau:

var mongoose  = require('mongoose'); 
var autoIncrement = require('mongoose-auto-increment'); 

/* connect to your database here */ 

/* define your CounterSchema here */ 

autoIncrement.initialize(mongoose.connection); 
CounterSchema.plugin(autoIncrement.plugin, 'Counter'); 
var Counter = mongoose.model('Counter', CounterSchema); 

Bạn chỉ cần khởi tạo autoIncrement một lần.

+2

Bạn có thể vui lòng cho tôi biết khi có nhiều yêu cầu đồng thời giải pháp của bạn sẽ hoạt động được hay không? và nếu có thì làm thế nào ?? –

4

Câu trả lời được bỏ phiếu nhiều nhất không hoạt động. Đây là việc sửa chữa:

var CounterSchema = new mongoose.Schema({ 
    _id: {type: String, required: true}, 
    seq: { type: Number, default: 0 } 
}); 
var counter = mongoose.model('counter', CounterSchema); 

var entitySchema = mongoose.Schema({ 
    sort: {type: String} 
}); 

entitySchema.pre('save', function(next) { 
    var doc = this; 
    counter.findByIdAndUpdateAsync({_id: 'entityId'}, {$inc: { seq: 1} }, {new: true, upsert: true}).then(function(count) { 
     console.log("...count: "+JSON.stringify(count)); 
     doc.sort = count.seq; 
     next(); 
    }) 
    .catch(function(error) { 
     console.error("counter error-> : "+error); 
     throw error; 
    }); 
}); 

Các tùy chọn thông số cung cấp cho bạn kết quả của bản cập nhật và nó tạo ra một tài liệu mới nếu nó không tồn tại. Bạn có thể kiểm tra here tài liệu chính thức.

Và nếu bạn cần một tấm séc chỉ số được sắp xếp này doc

-1

Những câu trả lời dường như để tăng chuỗi thậm chí nếu tài liệu đã có một trường _id (sắp xếp, bất cứ điều gì). Đây sẽ là trường hợp nếu bạn 'lưu' để cập nhật tài liệu hiện có. Không?

Nếu tôi đúng, bạn muốn gọi tới() nếu this._id! == 0

Các tài liệu mongoose không siêu rõ ràng về vấn đề này. Nếu nó đang làm một truy vấn cập nhật loại nội bộ, sau đó trước ('tiết kiệm' có thể không được gọi.

Làm rõ

Dường như 'tiết kiệm' phương pháp trước thực sự được gọi là trên bản cập nhật.

tôi don Đừng nghĩ rằng bạn muốn tăng số thứ tự của bạn một cách không cần thiết.Đó là một truy vấn và lãng phí số thứ tự

0

Tôi biết điều này đã có rất nhiều câu trả lời, nhưng tôi sẽ chia sẻ giải pháp của tôi là IMO ngắn và dễ sử dụng :

// Use pre middleware 
entitySchema.pre('save', function (next) { 

    // Only increment when the document is new 
    if (this.isNew) { 
    entityModel.count().then(res => { 
     this._id = res; // Increment count 
     next(); 
    }); 
    } else { 
    next(); 
    } 
}); 

Hãy chắc chắn rằng entitySchema._idtype:Number. Phiên bản Mongoose: 5.0.1.

Các vấn đề liên quan