我的用户对象包含一个带有时间对象的时隙数组(如下所示)。
"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":
来强制合并的查询条件,这些标准没有帮助。
我假设更新查询只是更新了时间段数组的第一个元素,但我不知道如何修复它。
答案 0 :(得分:1)
<强> $elemMatch 强>
$ elemMatch运算符匹配包含数组字段的文档,其中至少有一个元素符合所有指定的查询条件。
db.users.update(
{"timeslots" : { "$elemMatch":{"timestamp": 1495494000000, "lab": 1}}},
{ $set: {"timeslots.$.timestamp" : 1495508400000,"timeslots.$.durationfactor" : 4}}
,false
,true
);