gpt4 book ai didi

mongodb - Mongodb批量查找并更新单个查询中的匹配文档字段?

转载 作者:行者123 更新时间:2023-12-04 03:17:05 26 4
gpt4 key购买 nike

我有一个图像库,其中元存储在 mongo 中。每次网站查询匹配一定数量的存储图像时,我都希望文档 shown 计数器字段增加。使用 findAndModify 对于单个文档可以正常工作,但我看不到匹配多个文档并全部更新它们的好方法。

最新版本的 mongo 可以做到这一点吗?或者任何推荐的最佳实践来实现这一目标?

谢谢
浮点数

文件格式很简单

{
"name" : "img name",
"description" : "some more info",
"size" : "img size in bytes",
"shown" : "count of times the image was selected by query",
"viewed" : "count of times the image was clicked"
}

查询是一个简单的查找,然后使用光标循环结果并使用文档 ID 增加显示的计数。即
db.images.update(
{ _id: "xxxx" },
{ $inc: { shown: 1 } }
)

但我不希望获得 100 个文档,然后必须遍历每个文档以单独更新。希望在单个查询中执行查找和更新。

最佳答案

为了提高性能,请利用 Bulk() API 来高效地批量更新集合,因为您将批量发送操作到服务器(例如,批量大小为 500)。这为您提供了更好的性能,因为您不会将每个请求发送到服务器,而是每 500 个请求发送一次,从而使您的更新更高效、更快捷。

下面演示了这种方法,第一个示例使用 Bulk() API 在 MongoDB 版本 >= 2.6 和 < 3.2 中可用。它通过将 1 增加到显示的字段来更新给定数组中集合中所有匹配的文档。它假设图像数组具有以下结构

var images = [
{ "_id": 1, "name": "img_1.png" },
{ "_id": 2, "name": "img_2.png" }
{ "_id": 3, "name": "img_3.png" },
...
{ "_id": n, "name": "img_n.png" }
]

MongoDB 版本 >= 2.6 和 < 3.2:
var bulk = db.images.initializeUnorderedBulkOp(),
counter = 0;

images.forEach(function (doc) {
bulk.find({ "_id": doc._id }).updateOne({
"$inc": { "shown": 1 }
});

counter++;
if (counter % 500 === 0) {
// Execute per 500 operations
bulk.execute();
// re-initialize every 500 update statements
bulk = db.images.initializeUnorderedBulkOp();
}
})
// Clean up remaining queue
if (counter % 500 !== 0) { bulk.execute(); }

下一个示例适用于新的 MongoDB 版本 3.2,它自 deprecated 以来具有 Bulk() API,并使用 bulkWrite() 提供了一组更新的 api。

MongoDB 3.2 及更高版本:
var ops = [];
images.forEach(function(doc) {
ops.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": {
"$inc": { "shown": 1 }
}
}
});

if (ops.length === 500 ) {
db.images.bulkWrite(ops);
ops = [];
}
})

if (ops.length > 0)
db.images.bulkWrite(ops);

关于mongodb - Mongodb批量查找并更新单个查询中的匹配文档字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40124496/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com