gpt4 book ai didi

arrays - 如何使用 MongoDB 数组进行 upsert?

转载 作者:行者123 更新时间:2023-12-05 03:40:15 28 4
gpt4 key购买 nike

我正在尝试在 MongoDB 数组中插入、更新值。
我的 MongoDB 版本是 4.0.5。

这是我的收藏:

{
'id': 1,
'array': [{
'code': 'a'
}, {
'code': 'b'
}]
}

我正在尝试进行一些 upsert 查询以插入/更新数组,但直到那时我才找到好的解决方案。

我的过滤器是:

  • 'id'(指向正确的文档)
  • 'array.code'(指向正确的数组单元格)
  1. 如果文档存在于集合中但没有包含'code': 'c'的单元格
db.test.update({
'id': 1
}, {
$set: {'array.$[elem].test':'ok'}
}, {
upsert: true,
arrayFilters: [{'elem.code': 'c'}]
}
)

我没有错误,但也没有更新。
我想像这样在数组中插入元素:

// Desired result
{
'id': 1,
'array': [{
'code': 'a'
}, {
'code': 'b'
}, {
'code': 'c'
'test': 'ok'
}]
}
  1. 如果文档不存在于集合中
db.test.update({
'id': 3
}, {
$set: {'array.$[elem].test':'ok'}
}, {
upsert: true,
arrayFilters: [{'elem.code': 'a'}]
}
)

在那种情况下,我有这个错误:

WriteError: The path 'array' must exist in the document in order to apply array updates., full error: {'index': 0, 'code': 2, 'errmsg': "The path 'array' must exist in the document in order to apply array updates."}

我想用这样的查询元素插入一个新文档:

// Desired result
{
'id': 3,
'array': [{
'code': 'a'
'test': 'ok'
}]
}
查询参数中的

upsert: true 似乎不适用于数组。
非常感谢您的帮助。

最佳答案

upsert 在数组中无效,如果您将 MongoDB 版本从 4.0.5 更新到 4.2,那么您可以使用 update with aggregation pipeline从 MongoDB 4.2 开始,

情况 1:如果文档存在于集合中但没有包含 'code': 'c' 的单元格:

var id = 2;
var item = { code: "c", test: "ok" };

Playground

情况 2:如果文档不存在于集合中:

var id = 3;
var item = { code: "a", test: "ok" };

Playground

  • $ifNull 判断字段不存在则返回空
  • $cond 检查输入 code 是否在数组中
    • 是的,然后 $mep 迭代 array 的循环并检查条件是否匹配然后更新其他字段,否则返回一个空对象
    • $mergeObjects 将当前对象与更新的字段合并
    • 不,$concatArrays 将当前数组 与新项目对象连接
db.collection.update(
{ "id": id },
[{
$set: {
array: {
$cond: [
{
$in: [item.code, { $ifNull: ["$array.code", []] }]
},
{
$map: {
input: "$array",
in: {
$mergeObjects: [
"$$this",
{
$cond: [{ $eq: ["$$this.code", "c"] }, item, {}]
}
]
}
}
},
{
$concatArrays: [{ $ifNull: ["$array", []] }, [item]]
}
]
}
}
}],
{ upsert: true }
)

关于arrays - 如何使用 MongoDB 数组进行 upsert?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68225868/

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