最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - MongoDB Bulk Insert Operation instead of For-Loop - Stack Overflow

programmeradmin0浏览0评论

Let's consider a social network to be built by NodeJS and MongoDB.
So, if a user creates a new post, it should be saved to his/her followers feed.

The straightforward implementation of this operation as follow (simplified):

var newPost="New Post";
//get list of followers of user 1
var listOfFollowers = followersCollection.find({u:"1"}); 

for(var i=0;i<listOfFollowers.length;i++){
    var followerId = listOfFollowers[i]._id;
    //insert new post of user 1 to every follower feed
    feedsCollection.insertOne(
       {ownerId:followerId,authorId:"1",content:newPost}
    ); 
}

This, of course, has very bad performance in case of big numbers in followers count. How can do this with a single fast performing MongoDB query?

Let's consider a social network to be built by NodeJS and MongoDB.
So, if a user creates a new post, it should be saved to his/her followers feed.

The straightforward implementation of this operation as follow (simplified):

var newPost="New Post";
//get list of followers of user 1
var listOfFollowers = followersCollection.find({u:"1"}); 

for(var i=0;i<listOfFollowers.length;i++){
    var followerId = listOfFollowers[i]._id;
    //insert new post of user 1 to every follower feed
    feedsCollection.insertOne(
       {ownerId:followerId,authorId:"1",content:newPost}
    ); 
}

This, of course, has very bad performance in case of big numbers in followers count. How can do this with a single fast performing MongoDB query?

Share Improve this question edited Aug 29, 2019 at 8:25 Ashish Kamble 2,6254 gold badges22 silver badges29 bronze badges asked Aug 29, 2019 at 7:31 erfannf2erfannf2 852 silver badges9 bronze badges
Add a ment  | 

3 Answers 3

Reset to default 4

MongoDB provides bulk document insert functionality, check out this link - https://docs.mongodb./manual/reference/method/db.collection.initializeUnorderedBulkOp/

db.collection.initializeUnorderedBulkOp() It creates an unordered list of operations and mongodb executes this list in parallel, so it's fast and you don't have to take extra care of performance as mongo handles it.

For ordered insertions, you can use db.collection.initializeOrderedBulkOp().

e.g.

var newPost="New Post";
var bulk = db.followersCollection.initializeUnorderedBulkOp();
//get list of followers of user 1
var listOfFollowers = followersCollection.find({u:"1"}); 

for(var i=0;i<listOfFollowers.length;i++){
    var followerId = listOfFollowers[i]._id;
    //insert new post of user 1 to every follower feed
    bulk.insert( {ownerId:followerId,authorId:"1",content:newPost});
}
bulk.execute();

If you are using Mongoose then checkout Mongoose docs for the same. In the above example, I have just trying to explain how you can do it using plain MongoDB.

Insert Many Read this document I think you will get the answer

Check this:

var newPost="New Post";

//Object Array
var collection = []

//get list of followers of user 1
var listOfFollowers = followersCollection.find({u:"1"}); 

for(var i=0;i<listOfFollowers.length;i++){
    var followerId = listOfFollowers[i]._id;
    collection.push({ownerId:followerId,authorId:"1",content:newPost})
}
feedsCollection.insert(collection); //Or use insertMany()

You can create your object array and insert it at once. Check documentation :- https://docs.mongodb./manual/reference/method/db.collection.insert/#insert-multiple-documents

Even though this is a simple answer for your question, If the collection array has a large number of elements, there still might be performance issues. So the best way to handle this is using triggers. https://docs.mongodb./stitch/triggers/

发布评论

评论列表(0)

  1. 暂无评论