【问题标题】:MongoDB update query multiple criteriaMongoDB更新查询多个条件
【发布时间】:2017-10-23 13:53:56
【问题描述】:

我的用户对象包含一个带有时间槽对象的时间槽数组(如下所示)。

"username" : "bla",
"timeslots" : [
        {
                "lab" : 0,
                "timestamp" : 1495494000000,
                "durationfactor" : 4
        },
        {
                "lab" : 1,
                "timestamp" : 1495494000000,
                "durationfactor" : 4
        },
        {
                "lab" : 3,
                "timestamp" : 1495508400000,
                "durationfactor" : 4
        }

当我更新这些对象时,我得到了一个奇怪的异常情况。

我的更新查询(异常案例示例):

db.users.update(
    {"timeslots.timestamp" : 1495494000000, "timeslots.lab": 1},
    { $set: {"timeslots.$.timestamp" : 1495508400000,"timeslots.$.durationfactor" : 4}} 
    ,false 
    ,true
);

基本上它会检查(至少应该)时间戳和实验室是否等于特定值。这种组合是独一无二的(实验室不能在同一个时间戳上重叠,它们处于“使用中”)

这很有效,除非我在同一时间戳上有两个不同的实验室。

在提供的示例中,我希望将实验室 1 更新到实验室 3 的时间。但结果是实验室 0 将被更新。

如果同一实验室有两个不同的时间戳(相反的情况),则不会发生此行为。所以我现在真的傻眼了。

我也尝试使用{"$and": 来强制组合查询条件,但没有帮助。

我假设更新查询只是更新时间段数组的第一个元素,但我不知道如何解决这个问题。

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    $elemMatch

    $elemMatch 运算符匹配包含数组字段且至少有一个元素匹配所有指定查询条件的文档。

    db.users.update(
        {"timeslots" : { "$elemMatch":{"timestamp": 1495494000000, "lab": 1}}},
        { $set: {"timeslots.$.timestamp" : 1495508400000,"timeslots.$.durationfactor" : 4}} 
        ,false 
        ,true
    );
    

    【讨论】:

    • 如果我想同时满足我的两个条件,然后只更新或插入新的怎么办?新插入将由 upsert=true 进行,但条件应完全匹配。
    猜你喜欢
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多