MongoDB更新查询多个条件

时间:2017-05-23 14:33:14

标签: mongodb mongodb-query

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

"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":来强制合并的查询条件,这些标准没有帮助。

我假设更新查询只是更新了时间段数组的第一个元素,但我不知道如何修复它。

1 个答案:

答案 0 :(得分:1)

<强> $elemMatch

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

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