Why you do not use the findAndModify method? This method can create an 
document when it is not find via the upsert: true parameter. This method 
has the advantage to be atomic like a transaction and you get no problems 
when you run multiple node process which execute your findOrCreate method.

Am Sonntag, 29. Juli 2012 03:12:40 UTC+2 schrieb Jaime Morales:
>
> Hi,
>
> I am running into an issue trying to run multiple findOrCreate methods in 
> parallel.
>
> Here is the code:
>
> var findOrCreate = exports.findOrCreate = function (data, callback) {
>   if (!data.source) {
>     return callback(new ParamError('Missing account.source.'));
>   }
>   if (!data.external_id) {
>     return callback(new ParamError('Missing account.external_id'));
>   }
>
>   Account.findOne({
>     source: data.source,
>     external_id: data.external_id
>   }, function (err, account) {
>     if (err) {
>       return callback(err);
>     }
>     if (account) {
>       return callback(err, account);
>     }
>     account = new Account(data);
>     account.save(function (err) {
>       return callback(err, account);
>     });
>     
>   });
>
> };
>
> The issue is that I may have multiple queries for the same 
> source/external_id combo.  I am using async.parallel to handle them.  But 
> since the callbacks in mongoose are pushed onto the next tick, I end up in 
> a situation where 
>
>    1. a find is performed (pushing the create to the next tick)
>    2. another find is performed for the same source/external_id (pushing 
>    the create to the next tick)
>    3. a create is performed (for the first find)
>    4. an attempt is made to create again, but this time a duplicate key 
>    error is thrown (since I already created that account)
>    
> I originally tried to get around this by doing an upsert instead of find 
> or create, but that didn't work since I need access the the resulting item. 
>  I am not sure what the best way to handle this scenario is.  any ideas?
>

-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

Reply via email to