【发布时间】:2018-07-13 15:37:41
【问题描述】:
我遇到了一些在 Mongoose 中认为在 MongoDB 中微不足道的问题。
使用这样一个相当简单的架构
const UserSchema = new Schema({
groups: [
{
name: String,
members: [
{
hasAccepted: {
type: Boolean
}
}
]
}
]
});
当我创建新组时,每个成员对象当然都会获得一个 _id 属性。我只是想通过其 _id 选择该成员并更新其 hasAccepted 属性。
当我使用成员的 _id 运行查询时,我会为用户取回整个记录,这使得很难找到嵌套成员来更新它。
如何将结果缩减为仅具有找到的 ID 的成员并更新其属性?
我正在使用 Mongo 3.6.2 并尝试了新的 arrayFilters,但没有运气。
我的代码(使用 Node)在下面,它返回整个文档,但没有任何更新。
const query = {
groups : {
$elemMatch : { members : { $elemMatch : {_id : <id>} } }
}
};
const update = {$set: {'groups.$[].members.$[o].hasAccepted':true }};
const options = { new: true, arrayFilters:[{"o._id":<id>}] };
// Find the document
User.findOneAndUpdate(query, update, options, function(error, result) {
if (error) {
res.send(error);
} else {
res.send(result);
}
});
编辑:这是我正在使用的测试数据库的完整数据。我一直在测试的 _id 是第 1 组成员的一个:5a753f168b5b7f0231ab0621
[
{
"_id": {
"$oid": "5a7505452f93de2c90f49a20"
},
"groups": [
{
"name": "Group 2",
"_id": {
"$oid": "5a7543b8e254ab02cd728c42"
},
"members": [
{
"user": {
"$oid": "5a7543b8e254ab02cd728c41"
},
"_id": {
"$oid": "5a7543b8e254ab02cd728c43"
},
"hasAccepted": false
}
]
},
{
"name": "Group 1",
"_id": {
"$oid": "5a753f168b5b7f0231ab0620"
},
"members": [
{
"user": {
"$oid": "5a753f168b5b7f0231ab061f"
},
"_id": {
"$oid": "5a753f168b5b7f0231ab0621"
},
"hasAccepted": false
}
]
}
]
},
{
"_id": {
"$oid": "5a753f168b5b7f0231ab061f"
},
"groups": [],
},
{
"_id": {
"$oid": "5a7543b8e254ab02cd728c41"
},
"groups": [],
}
]
感谢您提供的任何帮助。
【问题讨论】:
-
你知道会员所属的群组名称还是只有会员的
_id? -
我知道名字,是的。这有帮助吗?