1

원하는 것은 데이터베이스에 대해 문서를 쿼리하고 필드가 설정되지 않은 경우 데이터베이스 대신 사용자 정의 값을 반환하는 것입니다.node.js/mongoDB : 필드가 null 인 경우 사용자 정의 값을 반환하십시오.

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); 
    }); 
} 

이를위한 가장 좋은 방법은 무엇입니까?

미리 감사드립니다. 이 빈 문자열 인 경우

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); 
    } 
); 
} 

: 필드의 값 중 하나 null 또는 해제 가능성이 문서에서 누락

+0

만약 여러분이 mongoose를 태그로 사용한다면, 스키마를 생성 할 때 기본값을 정의 할 수 있습니다 :'pathToCover : {type : String, 'default': 'path/to/somewhere'}' . – Protostome

+0

하지만 기본 문자열을 데이터베이스에 쓰지 않습니까? 내가 피하려고하는 것. – ngmir

답변

2

는, 당신은 대체 값으로 설정하기 위해 집계에 $ifNull를 사용 다음 $ifNull 대신에 $eq 시험으로 $cond 문을 사용

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

어느 문을 repla하는 그룹 연산자의 내부에 사용할 수 있습니다 고려되는 값.

당신은 단지 값이 노래에 설정되어 아마하지 "모든"에, 그럼 그냥 대신 $first을 사용하는 값 ​​중 하나를 선택하는 데이터에 대한 적절한 $min 또는 $max 같은 것을 사용 걱정하는 경우.

+0

고마워, 그게 내가 원하는거야. 문서에서'$ ifNull'을 (를) 샅샅이 훑어보아야합니다. – ngmir

관련 문제