【问题标题】:mongodb/mongoose arrayFilters (with $[]) update does not workmongodb/mongoose arrayFilters (with $[]) 更新不起作用
【发布时间】:2018-10-02 20:29:11
【问题描述】:

我使用 $[] 进行的更新无法正常工作。架构:

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 编写我的应用程序)。

【问题讨论】:

  • 现在无法测试,但认为您错过了 'type' 字段是您的 $set : 'tables.type.$[].reservedDuring...
  • @matthPen 我从未见过这样使用“类型”字段。无论哪种方式,我都尝试了可以​​想象的每个信号组合,并且每次都得到“{“ok”:0,“n”:0,“nModified”:0}”。我相信 mongodb 正在寻找名为“类型”的字段。
  • 但是你有一个名为 type 的字段!根据您的架构,表不是数组,但 tables.type 是一个。我不是在谈论字段的类型
  • 对不起,我一开始误会你了。但是我最初的实现结果不应该是“{”ok”:0,”n”:0,”nModified”:0}”吗?无论哪种方式,我都会尝试一下。谢谢。
  • 提供样本数据,我可以支持我。从来没有同时测试过 $[] 和 $[placeholder]。

标签: node.js mongodb typescript mongoose


【解决方案1】:

好的,我理解:您在架构中讲述日期格式,但实际上您将字段(reservedFrom 和 reservedTo)存储为字符串。所以你的 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 中一样)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 2018-04-23
    • 2020-07-09
    • 2018-06-21
    • 2020-10-09
    相关资源
    最近更新 更多