Mangosta: Salva atómica ()

Soy bastante nuevo en MongoDB y Express y estoy tratando de construir una aplicación de red social empresarial móvil. Por supuesto, estoy emparejando personas que actualmente están registradas en su rango geográfico. Para lograr este comportamiento, estoy consultando con geoNear framework y luego consultando la colección de coincidencias si dos de los usuarios coincidieron antes o no, si no han coincidido ya antes, simplemente estoy produciendo una entidad de coincidencia para ellos y guardando en la colección de coincidencias.

Aquí está mi código en mi modelo de registro,

const mongoose = require('mongoose'); const Match = require("./match"); const Schema = mongoose.Schema; const { wrap: async } = require('co'); const CheckInSchema = new Schema({ user: { type: Schema.Types.ObjectId, ref: 'User' }, createdAt: { type: Date, default: Date.now }, loc: { type: [Number], index: '2dsphere', default: [0, 0] }, range: { type: Number, default: 0 }, listable: { type: Boolean, default: true }, near: { type: String }, isCurrent: { type: Boolean, default: true }, searchable: { type: Boolean, default: true } }); CheckInSchema.pre('save', function (next) { if (this.isNew) { this.constructor.findOne({ isCurrent: true, user: this.user }, function (err, data) { if (data) { data.isCurrent = false; data.searchable = false; data.save(function (err, data) { next(); }); } else { next(); } }); } else { next(); } }); CheckInSchema.post('save', function (doc) { if (doc.isCurrent == true) { doc.constructor.searchForMatch(doc); } }); CheckInSchema.statics = { load: function(user){ return this.findOne({user:user,isCurrent:true}); }, searchForMatch: async(function* (checkin) { const query = yield this.aggregate([ { $geoNear: { near: { type: "Point", coordinates: checkin.loc }, distanceField: "distance", maxDistance: checkin.range, query: { isCurrent: true, searchable: true }, spherical: true } }, { $redact: { $cond: { if: { $lte: ["$distance", checkin.range] }, then: "$$KEEP", else: "$$PRUNE" } } }, { $lookup: { from: "users", localField: "user", foreignField: "_id", as: "user" }, }, { $unwind: "$user" }, { $match: { $and: [ { "user.interested": { $in: checkin.user.interested } }, { "user._id": { $ne: checkin.user._id } } ] } } ]); for (var key of query) { const users = [key.user, checkin.user] const checkins = [checkin, key]; const m = new Match({ user: users, checkin: checkins }); const isMatched = yield m.constructor.loadMatches(users); if (isMatched.length === 0) { yield m.save(); } } }) } module.exports = mongoose.model('Checkin', CheckInSchema); 

Aquí estoy controlando la situación.

 for (var key of query) { const users = [key.user, checkin.user] const checkins = [checkin, key]; const m = new Match({ user: users, checkin: checkins }); const isMatched = yield m.constructor.loadMatches(users); if (isMatched.length === 0) { yield m.save(); } } 

Aquí está el modelo Match

 const mongoose = require('mongoose'); const Schema = mongoose.Schema; const { wrap: async } = require('co'); const MatchSchema = new Schema({ createdAt: { type: Date, default: Date.now }, user: { type: [Schema.Types.ObjectId], ref: 'User' }, checkin: {type: [Schema.Types.ObjectId], ref: 'Checkin'} }); MatchSchema.statics = { loadMatches: function(users) { return this.find({ $or: [ { "user": { $eq: [users[0], users[1]] } }, { "user": { $eq: [users[1], users[0]] } } ] }); }, 

Pero hay un gran problema. Cuando dos de un cliente o un cliente, guarde el registro al mismo tiempo, con la naturaleza de no locking, la operación de guardar no es, por supuesto, atómica.

Muy curioso sobre eso ¿qué me falta? ¿Hay alguna manera de hacer que este comportamiento sea atómico en la mongoose?

Respeto a ti. Gracias.