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