首页 > 解决方案 > 猫鼬。如何更新包含在另一个数组中的数组元素?

问题描述

我有一个非常复杂的模式,它有一个内部数组,每个数组元素都包含一个级别数组。但是如何更新二级数组中的数据。

我需要更新services数组但如何获得访问权限?我有 Item 的 _id、线程号、班次号(只能是 3,这不是数组,因为三级数组太难了)和服务名称。

我需要类似(伪代码)

getByItemId(id) .getByThreadNumber(tNumber) .getByShift(numberShift) .getByServiceName(name) .updateLogInCounter(newValCounter)

const itemSchema = new Schema({
    threads: [
        {
            number: {
                type: Number,
                requred: true
            },
            {
                firstShift: {
                    "someData": ... ,
                    "services": [
                        "name": {type: String}
                        "lastUpdate": {type: Date},
                        "logInCounter": {type: Number}
                    ]
                },
                secondShift: {
                    "someData": ... ,
                    "services": [
                        "name": {type: String},
                        "lastUpdate": {type: Date},
                        "logInCounter": {type: Number}
                    ]
                },
                thirdShift: {
                    "someData": ... ,
                    "services": [
                        "name": {type: String},
                        "lastUpdate": {type: Date},
                        "logInCounter": {type: Number}
                    ]
                }
            }
        }
    ]
})

也许这个数据结构不正确,这是不可能的?也许我需要创建很多集合?也许一些插件可以帮助我。或者这很正常,如果是的话如何获取我的目标数据?

标签: javascriptmongoose

解决方案


您可以在 3.6 中使用以下代码

使用计算的属性名称来动态传递班次编号。$[identifier]位置运算符匹配线程号和服务名称,后跟线程服务内的增量 logInCounter。

var query = {'_id': id};
var inc = {'$inc':{'threads.$[t].' + [numberShift] + '.services.$[s].logInCounter':newValCounter}};
var arrayFilters = {arrayFilters: [{'t.number': tNumber, 's.name':name}]};
Item.findOneAndUpdate(query, inc, arrayFilters);

推荐阅读