Skip to content
Create a gist now

Instantly share code, notes, and snippets.

Q + Mongoose from StackOverflow
var mongoose = require('mongoose');
var conn = mongoose.connection;
var users = conn.collection('users');
var channels = conn.collection('channels');
var articles = conn.collection('articles');
var insertUsers = Q.nfbind(users.insert.bind(users));
var insertChannels = Q.nfbind(channels.insert.bind(channels));
var insertArticles = Q.nfbind(articles.insert.bind(articles));
function getInsertedArticles(usersArray) {
return insertUsers(usersArray).then(function (insertedUsers) {
var channelsArray = (user) {
return { userId: user._id };
return insertChannels(channelsArray).then(function (insertedChannels) {
var articlesArray = (channel, i) {
return { userId: users[i]._id, channelId: };
return insertArticles(articlesArray);
function (insertedArticles) {
// you only get here if all three of the above steps succeeded
function (error) {
// you get here if any of the above three steps failed

Original code from

var mongoose = require('mongoose');
var conn = mongoose.connection;

// insert users
conn.collection('users').insert([{/*user1*/},{/*user2*/}], function(err, docs) {
    var user1 = docs[0], user2 = docs[1];

    // insert channels
    conn.collection('channels').insert([{userId:user1._id},{userId:user2._id}], function(err, docs) {
        var channel1 = docs[0], channel2 = docs[1];

        // insert articles
        conn.collection('articles').insert([{userId:user1._id,channelId:channel1._id},{}], function(err, docs) {
            var article1 = docs[0], article2 = docs[1];

This should be labeled as an example for the node-mongodb-native driver and not Mongoose as only the native APIs are used here.


the original code is more readable and natural, and shorter, isn't it?


@newcoder it gets uglier when it you put error handling code.


I was hoping to see something simpler too. The problem here is the Mongoose promise implementation, right? I just want to be clear, so we can address this issue properly.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.