gpt4 book ai didi

Mongodb 更新子数组中的特定元素

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

我有一个具有以下架构的集合:

{
"_id" : 28,
"n" : [{
"a" : ObjectId("4ef8466e46b3b8140e000000"),
"c" : 28,
"p" : [ObjectId("4f00640646b3b88005000003"), ObjectId("4f00640146b3b88005000002"), ObjectId("4f00637d46b3b8cc0e000001"), ObjectId("4f00638046b3b8cc0e000002"), ObjectId("4f00638246b3b8cc0e000003"), ObjectId("4f00631646b3b85002000001"), ObjectId("4f00631846b3b85002000002")],
"u" : 26
}, {
"a" : ObjectId("4ef8466e46b3b8140e000000"),
"c" : 10,
"p" : [ObjectId("4f00640146b3b88005000002"), ObjectId("4f0063fd46b3b88005000001")],
"u" : 26
}, {
"a" : ObjectId("4ef8467846b3b8780d000001"),
"u" : 26,
"p" : [ObjectId("4f00637b46b3b8cc0e000000")],
"c" : 28
}, {
"a" : ObjectId("4ef85a3e46b3b84408000000"),
"u" : 26,
"p" : [ObjectId("4f00631046b3b85002000000")],
"c" : 28
}]
}

我需要用 _id = 28 更新文档中数组中的一个元素但前提是 a = 某个值且 c = 某个值

db.coll.update({
'_id' : 28,
'n.a' : new ObjectId('4ef85a3e46b3b84408000000'),
'n.c' : 28
},
{
$push : {
'n.$.p' : ObjectId("4b97e62bf1d8c7152c9ccb74")
},
$set : {
'n.$.t' : ISODate("2013-05-13T14:22:46.777Z")
}
})

所以基本上我想更新数组中的特定元素:就我们所见,这是第四个要素。问题是当查询执行时,它很可能会更新第一个元素。

我该如何解决?

最佳答案

您的代码中的问题是 dot-notation 因为当您指定点表示法时,您假定指定的过滤条件必须匹配满足所有条件的单个数组元素。但它没有。如果任何单个条件匹配,则数组上的点表示法可以拾取任何数组元素。这就是您收到意外更新的原因。

您必须使用 $elemMatch匹配 array 元素中的所有过滤器。

db.coll.update({
'_id' : 28,
n: {
$elemMatch:{
a : new ObjectId('4ef85a3e46b3b84408000000'),
c : 28 }
}
},
{
$push : {
'n.$.p' : ObjectId("4b97e62bf1d8c7152c9ccb74")
},
$set : {
'n.$.t' : ISODate("2013-05-13T14:22:46.777Z")
}
})

输出是

    {
"a" : ObjectId("4ef85a3e46b3b84408000000"),
"c" : 28,
"p" : [
ObjectId("4f00631046b3b85002000000"),
ObjectId("4b97e62bf1d8c7152c9ccb74")
],
"t" : ISODate("2013-05-13T14:22:46.777Z"),
"u" : 26
}

关于Mongodb 更新子数组中的特定元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9247007/

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