0

我正在尝试更新存在于另一个数组(嵌套数组)中的数组中的单个对象,但是所有记录都被删除并插入新记录会发生什么,这是我正在使用的结构:

"summary_mark" : [
    {
        "target_id" : "5aa27e77967c552b10ea725b", 
        "primitives" : [
            {
                "primitive" : "B", 
                "test_count" : NumberInt(3), 
                "right_test_count" : NumberInt(3), 
                "mark" : NumberInt(66)
            }, 
            {
                "primitive" : "T", 
                "test_count" : NumberInt(3), 
                "right_test_count" : NumberInt(3), 
                "mark" : NumberInt(66)
            }, 
            {
                "primitive" : "H", 
                "test_count" : NumberInt(3), 
                "right_test_count" : NumberInt(3), 
                "mark" : NumberInt(66)
            }
        ]
    }
], 

我要做的是更改原始数组中的一条记录。

实际上我正在尝试使用此功能更新记录:

$testCount = ++$primitiveSummaryMark['test_count'];
        $update['summary_mark.$.primitives'][$primKey]['primitive'] = $answer->primitive_value;
        $update['summary_mark.$.primitives'][$primKey]['test_count'] = $testCount;

        if ($answer->result != 0) {
            $rightAnswersCount = ++$primitiveSummaryMark['right_test_count'];
            $update['summary_mark.$.primitives'][$primKey]['right_test_count'] = $rightAnswersCount;
        } else {
            $rightAnswersCount = $primitiveSummaryMark['right_test_count'];
        }

        if ($testCount < $level_tests_amount->tests_count[$target_level]) {
            $totalTestCount = $level_tests_amount->tests_count[$target_level];
        } else {
            $totalTestCount = $testCount;
        }

        $primitiveTargetMark = ($rightAnswersCount * 100) / $totalTestCount;
        $update['summary_mark.$.primitives'][$primKey]['mark'] = $primitiveTargetMark;

我正在执行一些逻辑,然后运行此查询:

MyClass::raw()
        ->findOneAndUpdate([
            'course' => $this->first()->course,
            'summary_mark.target_id' => $data->target_id,
        ],
            ['$set' => $update]);

输入是这样的:

{"data":{ "target_id":"5aa27e77967c552b10ea725b","question":"5aa141b6c8af28381079e9c7", "answers":[{"primitive_value":"B","result":1,"elpassed_time":20,"distructor":""},{"primitive_value":"T","result":1,"elpassed_time":3,"distructor":""}]}}

我期望看到的是带有原语(B,T,H)的记录,但我得到(B,T)导致它们被更新的那些我是输入的原因

4

1 回答 1

0

旧线程,但我花了几天时间才弄清楚这一点。所以发布对我有用的东西。

这是为其构建的 Mongo 对象。

{
    "_id" : ObjectId("61965a0507254c65d472a905"),
    "name" : "Menu",
    "storeId" : "61965a0507254c65d472a902",
    "items" : [ 
        {
            "_id" : "61965a0507254c65d472a903",
            "link" : "home",
            "title" : "Home",
            "isPage" : true,
            "children" : []
        }, 
        {
            "_id" : "61965a1807254c65d472a907",
            "link" : "test-slug-changed",
            "title" : "Test Slug",
            "isPage" : true,
            "children" : []
        }
    ]
}

用例:通过 $StoreId 搜索文档,从找到的文档中查找并更新所有 _id 与给定 $id 匹配的项目。

解决方案 在 laravel-mongodb 中使用 db.collection.updateMany()。

  • 首先是一个带有过滤条件的数组。
  • 第二个使用 mongo 的 $set 运算符并使用由 arrayFilters 生成的迭代器的数组
  • 第三个数组过滤器,允许您遍历嵌套数组并过滤元素进行更新。这也将 i 作为位置变量公开以 $set 选择的元素进行更新。
Menus::raw()->updateMany(
   array ('storeId' => $data->storeId),
   [ '$set' => ["items.$[i].link" => $request->get("seo")['slug']] ],
   array( 'arrayFilters' => [ array ('i._id' => $id)] )
);
于 2021-11-18T14:10:22.670 回答