gpt4 book ai didi

mongodb - 如果数组存在则将对象推送到数组中,否则在 MongoDB 中使用对象创建数组

转载 作者:IT老高 更新时间:2023-10-28 13:11:29 25 4
gpt4 key购买 nike

我收集了这样的文档:

{
_id : "abcd",
name : "Tom",
myArray : [
{
field1 : "",
field2 : ""
}
]
},
{
_id : "efgh",
name : "Jerry"
}

我有一个 myArray 的新对象。我想写一个查询来只更新一个文档。

如果查询匹配带有 _id : "abcd" 的文档,则将新对象推送到 myArray 字段:

{
_id : "abcd",
name : "Tom",
myArray : [
{
field1 : "",
field2 : ""
},
{
// new object
}
]
}

如果查询与 _id : "efgh" 匹配,则创建字段 myArray 并在其中包含新对象:

{
_id : "efgh",
name : "Jerry"
myArray : [
{
// new object
}
]
}

我怎样才能做到这一点?

最佳答案

为了解释所有可能的情况,请考虑每个文文件例:

如果您要更改的文档如下所示:

{
"_id": "efgh",
"name": "Jerry"
}

然后是这样的更新语句:

db.collection.update(
{ "_id": "efgh" },
{ "$push": { "myArray": { "field1": "abc", "field2": "def" } } }
)

结果如下:

{
"_id": "efgh",
"name": "Jerry",
"myArray": [
{
"field1": "abc",
"field2": "def"
}
]
}

因此创建了数组并附加了新项目。

如果你的文档已经有这样的数组:

{
"_id": "abcd",
"name": "Tom",
"myArray": [
{
"field1": "",
"field2": ""
}
]
}

而你的声明基本相同:

db.collection.update(
{ "_id": "abcd" },
{ "$push": { "myArray": { "field1": "abc", "field2": "def" } } }
)

然后将新的文档内容追加到现有数组中:

{
"_id": "abcd",
"name": "Tom",
"myArray": [
{
"field1": "",
"field2": ""
},
{
"field1": "abc",
"field2": "def"
}
]
}

但是,如果您的原始文档具有命名字段但它不是数组,如下所示:

{
"_id": "efgh",
"name": "Jerry",
"myArray": 123
}

然后通过在查询条件中测试并使用 $set 确保它不是数组而是:

db.collection.update(
{ "_id": "efgh", "myArray.0": { "$exists": false } },
{ "$set": { "myArray": [{ "field1": "abc", "field2": "def" }] } }
)

这将使用包含您的内容的新数组安全地覆盖不是数组的元素(点表示法“myArray.0”表示第一个数组元素,这是不正确的)。结果和原来一样:

{
"_id": "efgh",
"name": "Jerry",
"myArray": [
{
"field1": "abc",
"field2": "def"
}
]
}

关于mongodb - 如果数组存在则将对象推送到数组中,否则在 MongoDB 中使用对象创建数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31770550/

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