使用 MongoDB 批量插入操作替代 for 循环

3
让我们考虑用NodeJS和MongoDB构建的社交网络。 因此,如果用户创建了一个新帖子,它应该保存到他/她的关注者动态中。
这个操作的直接实现如下(简化):
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}
    ); 
}

当粉丝数量很大时,这种方法的性能非常低。如何使用单个高性能的MongoDB查询来完成此操作?
3个回答

4
MongoDB提供了批量插入文档的功能,可以查看这个链接- https://docs.mongodb.com/manual/reference/method/db.collection.initializeUnorderedBulkOp/ db.collection.initializeUnorderedBulkOp()它创建一个未排序的操作列表,MongoDB并行执行该列表,因此速度很快,您不必额外关注性能,因为MongoDB会处理它。
对于有序插入,可以使用db.collection.initializeOrderedBulkOp()
例如:
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();

如果您正在使用Mongoose,请查看Mongoose文档。在上面的示例中,我只是试图解释如何使用纯粹的MongoDB完成它。


谢谢。虽然其他答案也不错,但这个是完美的答案。值得一提的是,MongoDB NodeJS驱动程序还支持UnorderedBulkOp,这是我目前正在使用的。 - erfannf2

2

1
检查一下这个:
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()

你可以创建对象数组并一次性插入。 查看文档:- https://docs.mongodb.com/manual/reference/method/db.collection.insert/#insert-multiple-documents 虽然这是对你问题的简单回答,但如果集合数组有大量元素,则仍可能存在性能问题。因此,处理这个问题的最佳方法是使用触发器。https://docs.mongodb.com/stitch/triggers/

1
谢谢你的答复。虽然它已经足够好了,但我认为UnorderedBulkOp更好,因为它可以并行执行操作。 - erfannf2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接