node.js - mongodb/mongoose arrayFilters (with $[]) 更新不起作用

标签 node.js mongodb typescript mongoose

我使用 $[] 的更新失败。架构:

tables: {
    type: [
        {
            tableID: String,
            numberOfChairs: Number,
            reserved: Boolean,
            location: String,
            inDoors: Boolean,
            reservedDuring: [
                {
                    reservedFrom: Date,
                    reservedTo: Date,
                    reservedFor: {
                        type: mongoose.Schema.Types.ObjectId,
                        ref: 'Consumer'
                    }
                }
            ]
        }
    ],
    required: false
},

我的更新功能:

TableBooking.updateMany({}, {
    '$set': {
        'tables.$[].reservedDuring.$[arr].reservedFrom': Date.now()
    }
}, { arrayFilters: [{
        'arr.reservedFrom': { $gte: Date.now() }
    }],
    multi: true
}, ).then(function (doc)){}

我的更新函数不断返回“{”n”:2,“nModified”:0,“ok”:1}”。我不知道为什么该函数拒绝更新数组元素。我有 2 个文档,其中满足 arrayfliters 的条件,但没有任何更改。我正在使用 MongoDB 4.0 和 mongoose 5.2.14 以及 @types/mongoose: 5.2.12 (我正在 TS 中编写我的应用程序)。

最佳答案

好吧,我明白:您在架构中讲述了日期格式,但实际上您将字段(reservedFrom 和servedTo)存储为字符串。所以你的 arrayFilters 与好的结果不匹配。 此外,Date.now() 将返回时间戳,而不是日期或 ISODate 的字符串表示形式。 我的建议是使用 ISODate 而不是 String,因为它更容易操作。这里的代码可以实现你想要的:

db['TableBooking'].updateMany({}, {
    '$set': {
        'tables.$[].reservedDuring.$[arr].reservedFrom': new ISODate()
    }
}, { arrayFilters: [{
        'arr.reservedFrom': { $gte: new ISODate().toISOString() }
    }],
    multi: true
} )

如果您仍然想使用字符串而不是日期,则必须通过在 $set 阶段的新 ISODATE() 处添加 .toISOString() 对此进行稍微修改(与 arrayFilters 中完全相同)

关于node.js - mongodb/mongoose arrayFilters (with $[]) 更新不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52605799/

相关文章:

javascript - 如何在 JavaScript 中使用 ISO-8859-15 字符集生成字符串?

node.js - 如何使用 Node.JS 查询 Azure App Insights 日志

python - 插入 Mongo 时如何处理 json 中的长整型?

java - MongoDB java 驱动程序可以在分片环境下执行 db.collection.group()

angularjs - AngularJS $routeProvider 模块的 TypeScript 示例

javascript - 为什么yarn在安装特定包时会提出以下请求?

javascript - 为什么 NodeJS/restify 服务器*很少*在接受时报告 EPERM?

javascript - 如何在没有托管页面的情况下从 node-webkit 获取桌面应用程序的访问 token ?

node.js - 使用 NodeJs 中的中间件调整图像大小

angular - 如何在 HTML 表格中实现依赖的 <select>