node.js / mongoDB:如果field为null,则返回自定义值

我想要做的是查询我的数据库文件,如果没有设置字段,返回一个自定义值而不是它。

想象一下,我有一个songs集合,其中一些有字段pathToCover设置和一些不。 对于这些,我想要返回的URL到一个占位符图像,我存储在一个configurationvariables。

我使用express和mongoose运行node.js和mongoDB。

我不确定这是什么最好的方法。 一个明显的解决scheme是查询文档,然后在callback中遍历它们以检查是否设置了字段。 但是这感觉是多余的。

目前,我的代码如下所示:

 exports.getByAlbum = function listByAlbum(query, callback) { Song.aggregate({ $group: { _id: '$album', artists: { $addToSet: '$artist' }, songs: { $push: '$title' }, covers: { $addToSet: '$pathToCover'}, genres: { $addToSet: '$genre'}, pathToCover: { $first: '$pathToCover'} } }, function (err, result) { if (err) return handleError(err); result.forEach(function(album) { if ( album.pathToCover == null) { album.pathToCover = config.library.placeholders.get('album'); } }) callback(result); }); } 

什么是最好的办法呢?

提前感谢!

如果字段的值为null或者未设置,并且可能从文档中缺失,那么您在聚合中使用$ifNull来设置替代值:

 exports.getByAlbum = function listByAlbum(query, callback) { var defaultCover = config.library.placeholders.get('album'); Song.aggregate( [ { "$group": { "_id": "$album", "artists": { "$addToSet": "$artist" }, "songs": { "$push": "$title" }, "covers": { "$addToSet": { "$ifNull": [ "$pathToCover", defaultCover ] } }, "genres": { "$addToSet": "$genre" }, "pathToCover": { "$first": { "$ifNull": [ "$pathToCover", defaultCover ] } } }} ], function (err, result) { if (err) return handleError(err); callback(result); } ); } 

如果它是一个空string,那么使用带有$eqtesting的$cond语句代替$ifNull

 { "$cond": [ { "$eq": [ "$pathToCover", "" ] }, defaultCover, "$pathToCover" ] } 

任何一个语句都可以在分组操作符中使用来replace所考虑的值。

如果你只是担心在歌曲上可能没有设置所有的值,那么使用像$min$max这样的适合你的数据来select其中一个值而不是使用$first