2017-05-13 13 views
0

たとえば、私はアクティビティフィードを作成したいと思いますが、複数のコレクションがあります。だから私はPostsLikesのコレクションを持っていて、これらのコレクションの両方からすべての値を取得し、それらを日付でソートして返したいと思います。 MongoDbに参加させずに複数のコレクションを照会する方法はありますか?複数のコレクションを照会して出力をソート

答えて

1

データベースを永続的に変更する場合は、Mongodb aggregate methodを使用できます。あなたは、しかし、私は、各ブログ記事の文書を持つ推薦することができ、むしろ別のコレクションに投稿や同類を保存するよりも、同類の数を持っている場合は

//This is what your final, sorted array of blog post objects will be 
var blogPosts = []; 
//Search posts collection 
db.posts.find({}, function(err, docs){ 
    //Sort by how long ago post was made 
    posts = docs.sort(function(a,b){return a.timeAgo - b.timeAgo}); 
    for(var i = 0; i < posts.length; i++){ 
     //Add blog post to final array 
     blogPosts.push({post:posts[i], likes:0}); 
    }; 
}.exec(function(err){ 
    //Once executed, find likes 
    db.likes.find({}, function(err, likes){ 
     for(var i = 0; i < likes.length; i++){ 
     var index = blogPosts.findIndexOf(function(post){ 
      //Find where in the array the postname associated with the like (I assume this is in your DB) is the name of a post 
      return post.name == likes[i].post; 
     }); 
     //Add to final array 
     blogPosts[index].likes +=1 
     }; 
    }); 
}); 

: しかし、あなたはまた、これを使用することができます。物事をもっと楽にするでしょう。

like: { 
    by: username, 
    post: blogpostname 
} 
post: { 
    by: username, 
    name: postname, 
    timeAgo: date, 
} 

...またはそれらの線に沿って何か:あなたは、各DBのドキュメント(私は推測)のために持っている何 。 代わりに、これはより効果的です:

post: { 
    by: username, 
    timeAgo: date, 
    name: postname, 
    likes: amountoflikes 
} 
関連する問題