1

Я хочу сделать запрос на мою базу данных для документов и, если поле не установлено, вернет пользовательское значение вместо него.node.js/mongoDB: Возвращает пользовательское значение, если поле равно null

Представьте, что у меня есть коллекция songs, и некоторые из них имеют поле pathToCover, а некоторые нет. Для этого я хочу вернуть URL-адрес образ-заполнителя, который я храню в переменной конфигурации.

Я бегу 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

Если вы используете mongoose (вы помещаете его как тег), вы можете определить значение по умолчанию при построении схемы: 'pathToCover: {type: String, 'default': 'path/to/something'}' , – Protostome

+0

, но не будет ли писать строку по умолчанию в базу данных? вот чего я пытаюсь избежать. – ngmir

ответ

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.

+0

Спасибо, это именно то, что я искал. Должно быть, в документах надстройка '$ ifNull'. – ngmir

Смежные вопросы