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

逃避

我在使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用存储库接口在Spring Data中通过其嵌套对象的objectId查找集合?

通过mongoose将条目推入MongoDB中的多层嵌套数组

Node.js mongodb通过ObjectID更新

通过提供正文mongoose / mongodb中的文档来更新多个文档

Mongoose MongoDB:更新嵌套数组中的对象

缩短Node.js和Mongoose中的ObjectId

卖出请求如何通过Angular,Express和Mongoose工作?

通过Mongoose(Node JS)在Mongo DB中插入不带JSON模式的JSON对象

使用mongoose通过更新方法向mongodb中的现有文档添加新字段

MongoDB在docker-compose环境中通过mongoose与nodeJs的连接

Node.js / Express和mongoose:通过自动拉入新数据建立“可观察”的mongodb Connection?

通过mongoose将嵌套对象结果从MongoDB获取到节点环境的麻烦

使用Tunnel-ssh通过ssh通过nodeJS中的mongoose通过SSH连接到远程服务器mongoDB

通过mongoose更新mongodb中嵌套数组中的数据对象

通过Mongoose JS实现MongoDB-funBtion中的findByID res

通过ID查找文档并在Mongoose中过滤子数组

在Mongoose中通过给定_id从数组中删除对象

在mongodb和mongoose中通过ID删除对象

无法通过Mongoose.js更新MongoDB中的日期

如何在Node.js和Mongoose中的对象数组中更新特定对象

如何更新嵌套字段对象而不在 Mongoose 中动态更新整个对象?

Mongoose 更新嵌套文档数组中嵌套对象中的值

如何通过 mongoose 中的引用对象属性检索对象

Mongoose 和 Nodejs 通过 id 获取用户名

在 Mongoose js 中查找和更新多个对象

使用其 id 更新 mongoose 数组中的嵌套对象

通过 mongoose nestjs 中的属性获取用户的正确方法

Mongoose update 更新数组内的嵌套对象

Mongoose:通过搜索查询获取对象