삽질 한 내용을 여기 올린다.

 

내가 가지고 있는 데이터가 아래와 같다고 하자.

 

여기 data filed 에 있는 데이터를 " :: " 로 나눈 후,

아래처럼 나눠진 값들을 각각의 다른 필드명으로 넣고 싶었다.

 

이 방법을 찾기 위해 구글링을 엄청 해대었고 결국 찾아내었다...!!

 

일단 $split 을 이용하여 배열로 만든 후에, 배열의 각 값을 하나씩 가져와서 projection 시키는 방법이다.

아래 aggregate 쿼리를 사용하면 된다.

 

db.movielens.aggregate([

{

$project : 

  { 

    _id:0,

    splits : { $split: ["$data", "::"] }

  }

},

{

$project :

  {

    fst : { $arrayElemAt : ["$splits", 0] },

    sec : { $arrayElemAt : ["$splits", 1] },

    thrd : { $arrayElemAt : ["$splits", 2] },

    frth : { $arrayElemAt : ["$splits", 3] }

  }

}

])

 

 

 

 

 

 

$project 대신 혹은 아래처럼 $addFields 를 사용할 수 도 있겠다.

 

db.movielens.aggregate([

{

$project : 

  { 

    _id:0,

    splits : { $split: ["$data", "::"] }

  }

},

{

$addFields :

  {

    fst : { $arrayElemAt : ["$splits", 0] },

    sec : { $arrayElemAt : ["$splits", 1] },

    thrd : { $arrayElemAt : ["$splits", 2] },

    frth : { $arrayElemAt : ["$splits", 3] }

  }

}

])

 

 

 

 

 

 

 

 

 

 

 

 

MongoDB $addFields : https://docs.mongodb.com/manual/reference/operator/aggregation/addFields/index.html

movielens sample data : https://github.com/apache/spark/blob/master/data/mllib/als/sample_movielens_ratings.txt

+ Recent posts