gpt4 book ai didi

Node.js MongoDB 批量操作 UpdateOne 与 arrayFilters

转载 作者:行者123 更新时间:2023-12-03 12:19:18 25 4
gpt4 key购买 nike

在批量操作中使用 arrayFilters 执行 NodeJS/MongoDB updateOne 的正确语法是什么?
MongoDB 版本:4.2.5
NodeJS 版本:12.x
npm mongodb 版本:3.6.0
鉴于以下简化集合。我需要更新 lineItems 数组中的一个元素。

{
_id: ObjectId("5d50689fd304e3189aae99ba"),
"lineItems" : [
{ "importId" : "abc123" },
{ "importId" : "def456" }
]
}
以下批量更新适用于 MongoDB shell:
var bulk = db.myCollection.initializeOrderedBulkOp();
bulk
.find({"_id": ObjectId(myId)})
.arrayFilters( [ { "elem.importId": "abc123" } ] )
.updateOne( { $set: { "lineItems.$[elem].meta": { "test": 1 } } } );
bulk.execute();
以下在 NodeJS 中有效(但它不是批量操作):
db.collection('myCollection').updateOne(
{ _id: ObjectID(myId) },
{ $set: { 'lineItems.$[elem].meta': { test: 1 } } },
{ arrayFilters: [{ 'elem.importId': lineItem.importId }] }
);
这张票意味着 NodeJS MongoDB 驱动程序在批量操作上支持 arrayFilters:
https://jira.mongodb.org/browse/NODE-1911
但是,我尝试了许多不同的变体。但例如,此代码返回错误“arrayFilters 不是函数”。
const bulkOp = db.collection('myCollection').initializeOrderedBulkOp()
bulkOp
.find({ _id: ObjectId(myId) })
.arrayFilters([{ 'elem.importId': lineItem.importId }])
.updateOne({ $set: { 'lineItems.$[elem].meta': { test: 1 } } });
以上基于 MongoDB 文档中的示例:
bulk
.find({}).
arrayFilters( [ { "elem.grade": { $gt: 85 } } ] ).
updateOne( { $set: { "grades.$[elem].mean" : 70 } } );
https://docs.mongodb.com/v4.2/reference/method/Bulk.find.arrayFilters/#Bulk.find.arrayFilters

最佳答案

MongoDB node.js 驱动程序似乎尚未正确支持 arrayFilters(从(3.6.0)开始)。
有一张 jira 票,其中包含使用“raw”的解决方法:
https://jira.mongodb.org/browse/NODE-2101
票中有一个很好的 vanilla node.js 驱动程序示例。但是,如果您尝试使用 Mongoose,这里有另一种基于 MongoDB documentation 的解决方案。 :
来自“students3”集合的 MongoDB 文档:

{
"_id" : 1,
"grades" : [
{ "type" : "quiz", "questions" : [ 12, 10, 5 ] },
{ "type" : "quiz", "questions" : [ 10, 11, 6 ] },
{ "type" : "hw", "questions" : [ 5, 4, 3 ] },
{ "type" : "exam", "questions" : [ 25, 10, 23, 0 ] }
]
}
Mongoose 代码(MongoDb 4.2.8 使用 Mongoose 5.9.28):
// @ts-ignore (required if "raw" is not part of @types)
const bulk = Students.collection.initializeOrderedBulkOp();
bulk.raw({
updateOne: {
updateOne: {
filter: {_id: mongoose.Types.ObjectId("5ed3243aa83d3a42ccff43e2")},
update: { $inc: { "grades.$[].questions.$[score]": 2 } },
arrayFilters: [ { "score": { $gte: 8 } } ]
}
}
});
我还发现,如果您尝试基于 ObjectId 进行过滤,则需要在 arrayFilters 中使用 $eq。

关于Node.js MongoDB 批量操作 UpdateOne 与 arrayFilters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63252048/

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