我在使用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组中成员的_id: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视为一种子查询,就像在SQL世界中使用的那样。一旦知道了这一点,便能够弄清楚如何编写更新。
本文对于理解如何使用arrayFilter也非常有帮助: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);
}
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句