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,那么使用带有$eq
testing的$cond
语句代替$ifNull
:
{ "$cond": [ { "$eq": [ "$pathToCover", "" ] }, defaultCover, "$pathToCover" ] }
任何一个语句都可以在分组操作符中使用来replace所考虑的值。
如果你只是担心在歌曲上可能没有设置所有的值,那么使用像$min
或$max
这样的适合你的数据来select其中一个值而不是使用$first
。