我的user对象包含一个带有timeslotobjects的timeslots数组(如下面所示)。
"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":来强制组合查询条件,但这并没有帮助。
我假设update查询只是更新时隙数组的第一个元素,但我不知道如何修复它。
发布于 2017-05-23 14:38:12
$elemMatch运算符将包含数组字段的文档与至少一个匹配所有指定查询条件的元素匹配。
db.users.update(
{"timeslots" : { "$elemMatch":{"timestamp": 1495494000000, "lab": 1}}},
{ $set: {"timeslots.$.timestamp" : 1495508400000,"timeslots.$.durationfactor" : 4}}
,false
,true
);https://stackoverflow.com/questions/44137731
复制相似问题