3

私は4つのコレクションを持っています

1.links(movieId,imdbId,tmdbId) 
2.movies(movieId,title,genres),
3.tags(userId,movieId,tag,timestamp), 
4.ratings(userId,movieId,rating,timestamp).

今私がする必要があるのは、次のようにそれらを1つのコレクションに集約することです

movieId,imdbId,tmdbId,
title,genres,
u_data{[
{userId,tag,tag_timestamp,
rating,rating_timestamp}
]}

どうすればこれを達成できますか。

link1 を参照しました。しかし、答えを出すことはできませんでした。(私はgrouplens.org のデータセットを使用しています)

4

1 に答える 1

0

簡潔にするために、最初の 2 つのコレクションを統合しました。さらに、彼らは1対1の関係を示唆しているので、あなたの場合のように16 MBの制限が問題にならない場合は、1つのドキュメントに保持することをお勧めします.....


db.t1.insert({
  movieId:1,
  title:"title-1",
  generes:["g1", "g2"],
  imdbId:111,
  tmdbId:112
});

db.t2.insert({
  movieId:1,
  userId:11,
  tag:"t1",
  timestamp: new Date()

});

db.t2.insert({
  movieId:1,
  userId:12,
  tag:"t2",
  timestamp: new Date()

});

db.t3.insert({
  movieId:1,
  userId:11,
  rating:2,
  timestamp: new Date()
});
db.t3.insert({
  movieId:1,
  userId:12,
  rating:3,
  timestamp: new Date()
});


db.t1.find().forEach(function(e){
  var mId = e.movieId;
  var arr = [];
  var finalOutput = {};
  finalOutput.movieId = mId;
  finalOutput.title = e.title;
  finalOutput.generes = e.generes;
  finalOutput.imdbId = e.imdbId;
  finalOutput.tmdbId = e.tmdbId;

  db.t2.find({"movieId":mId}).forEach(function(e2){
        var v = {};
        v.userId = e2.userId;
        v.tag = e2.tag;
        v.tag_ts = e2.timestamp;
        arr.push(v);
  });

for(i in arr){
    db.t3.find({movieId:mId,  userId:arr[i].userId}).forEach(function(e3){
        arr[i].rating = e3.rating;
        arr[i].rating_ts =e3.timestamp;
    });

}
  finalOutput.u_data = arr;
  printjson(finalOutput);
});

出力: https://www.dropbox.com/s/ijwg2xtbrwa8782/Screenshot%202015-06-22%2000.49.07.png?dl=0

于 2015-06-21T19:26:20.443 に答える