gpt4 book ai didi

javascript - MongoDB upsert 数组内

转载 作者:行者123 更新时间:2023-12-02 08:50:07 25 4
gpt4 key购买 nike

我正在尝试在 mongoDB 数组中插入、更新、删除值。我的 mongoDB 版本是3.4.23

这是我的收藏:

{
"link": "abc.com",
"Values": [{
"valueID": "v1",
"date": "05-07-2015",
"value": "10"
}]
}

我正在尝试做一些upsert一种插入/更新 Values 数组数据的查询,但无法执行此操作。我得到了this解决方案,但它对我不起作用。

假设我有 "valueID": "v1"

{
"valueID": "v1",
"date": "05-07-2015",
"value": "20"
}

所以在这种情况下,我想在上面的集合中设置 "value": "20" 所以输出应该是:

{
"link": "abc.com",
"Values": [{
"valueID": "v1",
"date": "05-07-2015",
"value": "20"//updated value
}]
}

如果我传递 "valueID": "v2" 那么它应该将新值插入到集合中,如下所示:

{
"link": "abc.com",
"Values": [{
"valueID": "v1",
"date": "05-07-2015",
"value": "10"
},
{
"valueID": "v2",
"date": "xyz",
"value": "xyz"
}]
}

我们将非常感谢您的帮助。

最佳答案

不幸的是,这无法使用 upsert 或类似方法在单个更新语句中完成。

这可以使用 bulkWrite() 来实现从 MongoDB 3.2 开始支持。

您还可以使用新的 update() MongoDB 4.2 中找到的命令 - 请注意,此命令仅在 4.2 中可用。

更新命令现在允许多个更新语句。虽然您可能需要运行两个更新命令,但您只需发送一次命令,然后让 MongoDB 为您批处理语句。

根据您的要求,您可以尝试以下操作,首先尝试使用 $ positional 更新数组中的相关元素。运算符。

然后我们使用 $addToSet数组运算符将尝试添加新的数组元素 - 仅当未找到匹配的数组元素时,它非常适合我们在步骤 1 中无法完成更新的场景。

两种解决方案都适合您的场景。

使用bulkWrite()

db.getCollection("tests").bulkWrite([
{
updateOne: {
filter: {link: "abc.com", "Values.valueID": "v2"},
update: {$set: {"Values.$.value": "xyz"}}
}
},
{
updateOne: {
filter: {link: "abc.com"},
update: {
$addToSet: {
"Values": {
"valueID": "v2",
"date": "05-07-2015",
"value": "xyz"
}
}
}
}
}
]);

使用新的 update() 命令:

db.runCommand(
{
update: "tests",
updates: [
{
q: {link: "abc.com", "Values.valueID": "v2"},
u: {$set: {"Values.$.value": "xyz"}}
},
{
q: {link: "abc.com"},
u: {
$addToSet: {
"Values": {
"valueID": "v2",
"date": "05-07-2015",
"value": "xyz"
}
}
}
}
],
ordered: false,
writeConcern: {w: "majority", wtimeout: 5000}
}
)

示例数据:

db.getCollection("tests").insertMany([{
"link": "abc.com",
"Values": [
{
"valueID": "v1",
"date": "05-07-2015",
"value": "10"
}
]
},
{
"link": "def.com",
"Values": [
{
"valueID": "v1",
"date": "05-07-2015",
"value": "1"
}
]
}]
);

当数组不存在时插入数组:

db.runCommand(
{
update: "tests",
updates: [
{
q: {link: "abc.com", "Values.valueID": "v2"},
u: {$set: {"Values.$.value": "xyz"}}
},
{
q: {link: "abc.com"},
u: {
$addToSet: {
"Values": {
"valueID": "v2",
"date": "05-07-2015",
"value": "xyz"
}
}
}
}
],
ordered: false,
writeConcern: {w: "majority", wtimeout: 5000}
}
)

结果:

    { 
"_id" : ObjectId("5dd8164969f4361ce9821b88"),
"link" : "abc.com",
"Values" : [
{
"valueID" : "v1",
"date" : "05-07-2015",
"value" : "20"
},
{
"valueID" : "v2",
"date" : "05-07-2015",
"value" : "xyz"
}
]
}

更新现有值:

db.runCommand(
{
update: "tests",
updates: [
{
q: {link: "abc.com", "Values.valueID": "v2"},
u: {$set: {"Values.$.value": "new value"}}
},
{
q: {link: "abc.com"},
u: {
$addToSet: {
"Values": {
"valueID": "v2",
"date": "05-07-2015",
"value": "new value"
}
}
}
}
],
ordered: false,
writeConcern: {w: "majority", wtimeout: 5000}
}
)

结果:

{ 
"_id" : ObjectId("5dd8164969f4361ce9821b88"),
"link" : "abc.com",
"Values" : [
{
"valueID" : "v1",
"date" : "05-07-2015",
"value" : "20"
},
{
"valueID" : "v2",
"date" : "05-07-2015",
"value" : "new value"
}
]
}

关于javascript - MongoDB upsert 数组内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58989072/

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