2015-04-16 2 views
3

J'ai quatre collectionsComment rassembler plusieurs collections efficacement dans une collection

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

Maintenant, ce que je dois faire est de les regrouper dans une collection comme suit

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

Comment puis-je parvenir. J'ai mentionné link1. Mais ne pouvait pas joindre avec une réponse. (j'utilise dataset from grouplens.org)

Répondre

0

Par souci de concision, j'ai fusionné vos deux premières collections. De plus, comme ils suggèrent une à une relation, de sorte que son conseillé de le conserver dans un document unique si la limite de 16 Mo n'est pas la préoccupation comme dans votre cas .....


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

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