gpt4 book ai didi

javascript - 使用 $ne 查询后更新数组中的属性

转载 作者:行者123 更新时间:2023-12-02 19:58:06 25 4
gpt4 key购买 nike

我收藏的文档 rooms具有以下结构:

{
"_id": { "$oid": "4edaaa4a8d285b9311eb63ab" },

"users": [
{
"userId": { "$oid": "4edaaa4a8d285b9311eb63a9" },
"unreadMessages": 0
},

{
"userId": { "$oid": "4edaaa4a8d285b9311eb63aa" },
"unreadMessages": 0
},
]
}

我想增加unreadMessages如果我知道 ObjectId 第二个用户(数组中索引 1 处的用户)的第一个用户的。了解_id文档的 足以进行选择,但为了更新,我需要能够引用其他用户,所以我也通过 users 选择。我通过以下更新调用来执行此操作:

collections.rooms.update(
{
_id: ObjectId("4edaaa4a8d285b9311eb63ab"),

users: { // not first user
$elemMatch: { $ne: { userId: ObjectId("4edaaa4a8d285b9311eb63a9") } }
}
},

{
// this should increment second user's unreadMessages,
// but does so for unreadMessages of first user
$inc: { "users.$.unreadMessages": 1 }
}
);

它增加unreadMessages 第一个用户的,而不是第二个用户的。我想这是因为$ne实际上匹配第一个用户,显然这就是 users.$指的是。

我应该如何修改此调用,以便第二个用户的 unreadMessages增加了吗?

最佳答案

我认为你做的是正确的事情,除了 $ne 周围有一点语法阅读障碍。查询约束。

那么你在哪里

users: {           // not first user
$elemMatch: { $ne: { userId: ObjectId("4edaaa4a8d285b9311eb63a9") } }
}

相反,你想要

users: {           // not first user
$elemMatch: { userId: { $ne: ObjectId("4edaaa4a8d285b9311eb63a9") } }
}

如果我每次进行相同类型的交换都能得到五分钱……我就会得到很多五分钱。 :)

实际上,如果你想把事情变得更紧密,那么 $elemMatch 并不是真正需要的,因为你只约束匹配数组元素的一个属性。我认为您可以将整个查询条件归结为:

{
_id: ObjectId("4edaaa4a8d285b9311eb63ab"),
users.userId: { $ne : ObjectId("4edaaa4a8d285b9311eb63a9") }
}

关于javascript - 使用 $ne 查询后更新数组中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8371840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com