gpt4 book ai didi

mongodb - 通过 Mongoose.js 中的 ObjectId 选择和更新嵌套对象

转载 作者:可可西里 更新时间:2023-11-01 10:39:44 25 4
gpt4 key购买 nike

我在使用 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": [],

}
]

感谢您提供的任何帮助。

最佳答案

好的,事实证明我需要更好地理解的是 arrayFilters(那个,我需要将组名添加到我用来获取我需要更新的值的数据中。

最能帮助我理解 arrayFilters 的是将其视为一种子查询,就像在 SQL 世界中使用的那样。一旦我明白了,我就能弄清楚如何编写我的更新。

这篇文章也非常有助于理解 arrayFilters 的使用方式:http://thecodebarbarian.com/a-nodejs-perspective-on-mongodb-36-array-filters.html

这是对我有用的代码。请注意,您需要 Mongo 3.6 和 Mongoose 5.0.0 才能获得对 arrayFilters 的支持。

此外,您需要确保像这样要求 Mongoose 的 ObjectId

const ObjectId = require('mongoose').Types.ObjectId;

这是其余的工作代码:

const query = {
groups : {
$elemMatch : { members : { $elemMatch : {_id : new ObjectId("theideofmymemberobject"), hasAccepted : false} } }
}
};

const update = {$set: {'groups.$[group].members.$[member].hasAccepted':true } };
const options = { arrayFilters: [{ 'group.name': 'Group 3' },{'member._id': new ObjectId("theideofmymemberobject")}] };

// update the document
User.update(query, update, options, function(error, result) {
if (error) {
res.send(error);
} else {
res.send(result);
}
});

关于mongodb - 通过 Mongoose.js 中的 ObjectId 选择和更新嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48594481/

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