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

时间:2014-11-02 10:30:16

标签: node.js mongodb mongoose mongodb-query aggregation-framework

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

想象一下,我有一个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);
    });
}

最佳方法是什么?

提前多多感谢!

1 个答案:

答案 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