gpt4 book ai didi

php - mongodb php 找到一个子对象并删除它,$inc 其他子对象

转载 作者:搜寻专家 更新时间:2023-10-30 22:20:42 25 4
gpt4 key购买 nike

我正在尝试从我的文档中删除子对象“apples”并更新“fruitInventory”属性,减少苹果的数量。

我对如何继续感到困惑,我应该使用点符号还是对苹果进行全文搜索?我不知道这是否重要,但你可以假设苹果总是在字段 1 中。

// Document 1 
{
"1": {
"apples": 3,
"fruitInventory": 21,
"oranges": 12,
"kiwis": 3,
"lemons": 3
},
"2": {
"bananas": 4,
"fruitInventory": 12,
"oranges": 8,
},
"_id": "1"
}

// Document 2
{
"1": {
"apples": 5,
"fruitInventory": 10,
"oranges": 2,
"pears": 3
},
"2": {
"bananas": 4,
"fruitInventory": 6,
"cherries": 2,
},
"_id": "2"
}

结果应该是这样的:

// Document 1 
{
"1": {
"fruitInventory": 18,
"oranges": 12,
"kiwis": 3,
"lemons": "3"
},
"2": {
"bananas": 4,
"fruitInventory": 12,
"oranges": 8,
},
"_id": "1"
}

// Document 2
{
"1": {
"fruitInventory": 5,
"oranges": "2",
"pears": "3"
},
"2": {
"bananas": 4,
"fruitInventory": 6,
"cherries": 2,
},
"_id": "2"
}

预先感谢您的帮助。

最佳答案

在 MongoDB 查询语言中,无法使用文档中的信息更新文档。换句话说,无法使用另一个属性的值来增加一个属性。具体来说:无法将 fruitInventory 增加 X,其中 X 是作为原子操作的 apples 属性的值。

我在避免竞争的同时实现它的方法是使用两个 findAndModify 操作(在此处的 Mongo shell 语法中看到):

var fruit = db.fruit.findAndModify({
query: {locked: {$ne: true}, "1.apples": {$exists: true}},
update: {$set: {locked: true}}
});

var fruitInventory = fruit["1"]["fruitInventory"];
var apples = fruit["1"]["apples"];

db.fruit.findAndModify({
query: {"_id": fruit["_id"]},
update: {
$set: {"1.fruitInventory": fruitInventory + apples},
$unset: {locked: false, "1.apples": true}
}
});

发生的事情是这样的:首先我找到一个未锁定的文档(稍后会详细介绍),并且具有 1.apples 属性。返回并更新文档以获取 locked 属性作为单个原子操作。由于文档现在有一个 locked 属性,它不会被同一个查询找到,所以这个查询可以并行运行多次,而不会有修改同一个文档两次的风险。

然后我提取 1.fruitInventory1.apples,以简化下一个表达式。

第二个 findAndModify 使用新的总和更新 1.fruitInventory 属性,并取消设置 1.apples 属性,以及locked 属性(将文档返回到之前的解锁状态)。

要更新所有文档,您必须一遍又一遍地运行此代码,直到第一个 findAndModify 返回 null(意味着没有与查询匹配的文档)。

关于php - mongodb php 找到一个子对象并删除它,$inc 其他子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4527591/

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