Insert seems to always report n=0. Update and delete seem to make it match the last op. This differs from how the upserted field is handled.
> [db.foo.runCommand('update', {updates:[{q:{_id:1}, u:{an: 'object'}, upsert:true}, {q:{_id:2}, u:{an: 'object'}, upsert:true}]}), db.getLastErrorObj()] [ { "ok" : 1, "nModified" : 0, "n" : 2, "upserted" : [ { "index" : 0, "_id" : 1 }, { "index" : 1, "_id" : 2 } ] }, { "connectionId" : 2, "updatedExisting" : false, "upserted" : 2, "n" : 1, "syncMillis" : 0, "writtenTo" : null, "err" : null, "ok" : 1 } ] > [db.foo.runCommand('insert', {documents:[{},{}]}), db.getLastErrorObj()] [ { "ok" : 1, "n" : 2 }, { "connectionId" : 2, "n" : 0, "syncMillis" : 0, "writtenTo" : null, "err" : null, "ok" : 1 } ] > [db.foo.runCommand('delete', {deletes:[{q:{}, limit:1},{q:{}, limit:0}]}), db.getLastErrorObj()] [ { "ok" : 1, "n" : 4 }, { "connectionId" : 2, "n" : 3, "syncMillis" : 0, "writtenTo" : null, "err" : null, "ok" : 1 } ]