gpt4 book ai didi

MongoDB 项目在 "findAndModify"查询中更新了嵌套数组中的记录

转载 作者:IT老高 更新时间:2023-10-28 12:31:34 26 4
gpt4 key购买 nike

我正在尝试在嵌套数组中查找记录,对其进行修改,然后进行投影。

假设我有以下收藏:

{
"_id" : ObjectId("56558dfc45a06f51decb4ab7"),
"arr" : [
{
"cond" : 1.0000000000000000,
"upd" : 2.0000000000000000
},
{
"cond" : 2.0000000000000000,
"upd" : 3.0000000000000000
},
{
"cond" : 4.0000000000000000,
"upd" : 5.0000000000000000
},
{
"cond" : 6.0000000000000000,
"upd" : 7.0000000000000000
},
{
"cond" : 8.0000000000000000,
"upd" : 9.0000000000000000
}
]
}

我想找到“cond=4”所在的记录,更新为“upd=55”并返回记录。

我尝试了以下查询:

db.tests.findAndModify({
query:{
"arr": {"$elemMatch": {"cond":4}}
},
update: {
"$set": {"arr.$": {"cond": 4, "upd": 55, "new": true}}
},
fields: {"arr.$":1}
})

它很好地执行了更新,但我收到以下结果:

{
"_id" : ObjectId("56558dfc45a06f51decb4ab7"),
"arr" : [
{},
{},
{},
{},
{}
]
}

*我使用的是 MongoDB 版本:3.0.7

最佳答案

你也可以试试 positional $ 运算符与 findAndModify() 一起使用 方法。运算符将标识要更新的数组中的元素,而无需明确指定该元素在数组中的位置。请注意,数组字段必须作为查询文档的一部分出现,并且要返回对更新所做的修改的文档,请使用新选项,这样您的更新就会像

db.tests.findAndModify({
query: {
"arr.cond": 4
},
update: {
"$set": {"arr.$.upd": 55 }
},
new : true,
fields: { "arr": 1, "_id": 0 }
})

将产生输出:

{
"arr": [
{
"cond" : 1,
"upd" : 2
},
{
"cond" : 2,
"upd" : 3
},
{
"cond" : 4,
"upd" : 55
},
{
"cond" : 6,
"upd" : 7
},
{
"cond" : 8,
"upd" : 9
}
]
}

由于您想返回更新后的文档,因此投影位置 $ projection 运算符只能用在 find() 方法或 findOne() 方法的投影文档中,所以 findAndModify() field 选项不会使用 $ projection 投影数组的该部分。 运算符。

一种解决方法是使用原生 JavaScript filter() 在返回的 arr 字段上的方法为

var result = db.tests.findAndModify({
query: {
"arr.cond": 4
},
update: {
"$set": {"arr.$.upd": 55 }
},
new : true,
fields: { "arr": 1, "_id": 0 }
})

var updated = []
if (result && result.arr) updated = result.arr.filter(function (item) { return item.cond == 4; });
printjson(updated);

这将打印出来

[ { "cond" : 4, "upd" : 55 } ]

-- 更新--

$elemMatch 您在下面的评论中建议的投影:

var result = db.tests.findAndModify({
query: {
"arr.cond": 4
},
update: {
"$set": {"arr.$.upd": 55 }
},
new : true,
fields: {"arr": {"$elemMatch": { "cond": 4 } }, "_id": 0 }
})

printjson(result);

输出:

{ "arr" : [ { "cond" : 4, "upd" : 55 } ] }

关于MongoDB 项目在 "findAndModify"查询中更新了嵌套数组中的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33914509/

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