La Z significa "spostamento dell'ora zero" noto anche come "ora Zulu" (UTC). Quando si esegue una query sulla data dal database, esistono due possibili scenari in cui la data viene modificata, nel livello del database o nel livello dell'applicazione, adattandola al fuso orario in cui ci si trova.
Quindi, ad esempio, se l'impostazione del database salva automaticamente il tempo in UTC quando si ottengono i dati effettivi, verrà convertito nel fuso orario corrente. Ma dal tuo esempio 2016-12-20 viene convertito in 2016-12-19T23:00:00.000Z quindi suppongo che l'impostazione del database in data lo stia salvando in un determinato fuso orario e poi convertendolo in UTC.
Per risolverlo prova a regolare la logica dell'applicazione o l'impostazione del database, per me preferisco farlo a livello di applicazione e mantenere la data nel DB da salvare in UTC.
Prova questo per vedere la differenza e potrebbe darti un suggerimento per risolvere il tuo problema:
var currentDate = new Date();
var isoDate = currentDate.toISOString();
console.log(currentDate, isoDate);