【问题标题】:node.js/mongoDB: Return custom value if field is nullnode.js/mongoDB:如果字段为空,则返回自定义值
【发布时间】:2014-11-03 06:36:13
【问题描述】:

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

想象一下我有一个songs 的集合,其中一些设置了pathToCover 字段,而有些则没有。对于这些,我想将 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);
    });
}

最好的方法是什么?

提前非常感谢!

【问题讨论】:

  • 如果你使用猫鼬(你把它作为标签),你可以在构造模式时定义一个默认值:pathToCover: { type:String, 'default': 'path/to/somewhere' }
  • 但这不会将默认字符串写入数据库吗?这就是我要避免的。

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


【解决方案1】:

如果该字段的值为 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);
    }
  );
}

如果它是一个空字符串,则使用带有$eq 测试的$cond 语句代替$ifNull

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

任一语句都可以在分组运算符中使用来替换所考虑的值。

如果您只是担心歌曲中可能没有设置“所有”值,请根据您的数据使用 $min$max 之类的值来选择其中一个值,而不是使用$first.

【讨论】:

  • 谢谢,这正是我想要的。必须在文档中监督$ifNull
猜你喜欢
  • 1970-01-01
  • 2019-05-02
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
相关资源
最近更新 更多