gpt4 book ai didi

PHP/MongoDB : update a value in an array

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

我有以下 mongodb 对象:

{
"_id": ObjectId("4d0b9c7a8b012fe287547157"),
"messages": {
"0": {
"toUname": "Eamorr3",
"fromUname": "Eamorr2",
"time": 1292606586,
"id": "ABCDZZZ",
"subject": "asdf",
"message": "asdf",
"read": 0 //I want to change this to 1!
},
"1": {
"toUname": "Eamorr1",
"fromUname": "Eamorr3",
"time": 1292606586,
"id": "EFGHZZZ",
"subject": "asdf2",
"message": "asdf2",
"read": 0
}
},
"uname": "Eamorr3"
}

如何在 id=ABCDZZZZ 的情况下将“读取”设置为 1?我正在使用 PHP。

我尝试了以下命令:

$driverInboxes->update(array('uname'=>$uname),array('$set'=>array('messages'=>array('id'=>$id,'read'=>'1'))));

但是当我这样做时,会发生覆盖并且我得到:

{
"_id": ObjectId("4d0b9c7a8b012fe287547157"),
"messages": {
"id": "j7zwr2hzx14d3sucmvp5",
"read": "1"
},
"uname": "Eamorr3"
}

我完全被困住了。非常感谢任何帮助。

我需要拉出整个数组元素,修改并重新推回吗?

非常感谢,

最佳答案

如果您阅读您的命令,您实际上是在说:“UPDATE WHERE uname = Eamorr3 SET messages equal to this array (id=blah,read=1)”

当您对 messages 执行 $set 时,您基本上是在指示它将您的数组作为新值。

但是,您似乎正在尝试将特定消息更新为已读,这有点复杂。所以这里有两个障碍:

1:您实际上是在更新 messages.0.read

如果您执行 array('$set' => array( 'messages.0.read' => 1 ) ),您将更新正确的元素。遵循该链,messages 是一个 javascript 对象,您要更新属性 00 属性本身就是一个 javascript 对象,其中包含要更新的属性 read

你能看到你是如何更新 messages.0.read 的吗?

这给我们带来了问题 #2。

2:0对你来说是个问题

如果您查看您在 Mongo 中构建数据的方式,消息对象确实低于标准。 “0”和“1”当前充当“id”,它们不是很有用。就个人而言,我会用实际 ID 代替“0”或“1”来构建您的对象。

所以您的对象将如下所示:

{
"_id": ObjectId("4d0b9c7a8b012fe287547157"),
"messages": {
"ABCDZZZ": {
"toUname": "Eamorr3",
"fromUname": "Eamorr2",
"time": 1292606586,
"subject": "asdf",
"message": "asdf",
"read": 0 //I want to change this to 1!
}
},
"uname": "Eamorr3"
}

现在你的更新命令变成了这样:

array('$set' => array('messages.ABCDZZZ.read' => 1))

这种结构使更新特定消息或消息的特定部分变得更加容易。

关于PHP/MongoDB : update a value in an array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4473724/

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