我想要查询我的数据库中的文档,如果没有设置字段,则返回自定义值而不是它。
想象一下,我有一个songs
的集合,其中一些有pathToCover
字段设置,有些没有。{0}}。对于这些,我想将URL返回到我存储在配置变量中的占位符图像。
我使用express和mongoose运行node.js和mongoDB。
我不确定最好的办法是什么。一个明显的解决方案是查询文档,然后在回调中迭代它们以检查字段是否已设置。但这感觉非常多余。
目前,我的代码如下所示:
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);
});
}
最佳方法是什么?
提前多多感谢!
答案 0 :(得分:2)
如果该字段的值为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);
}
);
}
如果是空字符串,请使用带有$cond
测试的$eq
语句代替$ifNull
:
{ "$cond": [ { "$eq": [ "$pathToCover", "" ] }, defaultCover, "$pathToCover" ] }
可以在分组运算符内部使用任一语句来替换所考虑的值。
如果您只是担心可能没有在歌曲上设置“全部”值,那么请使用$min
或$max
之类的内容作为您的数据,只需选择其中一个值而不是$first
。