mongodb - 从嵌套对象数组中删除对象 mongodb

标签 mongodb mongodb-query

我有一个包含志愿者信息的集合,它将志愿者列为一个对象数组。我可以显示每个志愿者的所有类次,但事实证明从数组中删除一个对我来说很困难:

示例数据:

"_id" : ObjectId("59180305c19dbaa4ecd9ee59"),
    "where" : "Merchandise tent",
    "description" : "Sell gear at the merchandise tent.",
    "shifts" : [
            {
                    "dateNeeded" : ISODate("2017-06-23T00:00:00Z"),
                    "timeslot" : "8:00 - NOON",
                    "needed" : 2,
                    "_id" : ObjectId("591807546a71c3a57d1a2105"),
                    "volunteers" : [
                            {
                                    "fullname" : "Mary Mack",
                                    "phone" : "1234567890",
                                    "email" : "mary@gmail.com",
                                    "_id" : ObjectId("591ce45bc7e8a8c7b742474c")
                            }
                    ]
            },

我可用的数据是: _id, where, shifts.timeslot, shifts.dateNeeded, volunteers.email

有人可以帮助我吗?假设 Mary Mack 想在商品帐篷的 8 点中午轮类时不做志愿者。她也可能列在其他类次下,但我们只想将她从该类次中删除。

最佳答案

您可以通过指定一些内容来匹配“文档”,然后将所需的“shifts”数组条目作为 .update() 的查询表达式来执行此操作。然后申请 positional $ operator对于匹配的数组索引 $pull :

db.collection.update(
 { "_id": ObjectId("59180305c19dbaa4ecd9ee59"), "shifts.timeslot": "8:00 - NOON" },
 { "$pull": { "shifts.$.volunteers": { "fullname": "Mary Mack" } } }
)

在这种情况下没关系,因为您只是试图“匹配”嵌套结构中的“外部”数组和 $pull有自己的查询参数来标识要删除的数组条目。

不过你真的应该小心使用“嵌套数组”。同时$pull像这样的操作有效,更新“内部”数组是不可能的,因为 positional $ operator只会匹配满足条件的“第一个”元素。因此,您的多次轮类“Mary Mack”示例只会在找到的第一个“轮类”数组条目中匹配。

关于mongodb - 从嵌套对象数组中删除对象 mongodb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44124734/

相关文章:

Mongodb聚合5分钟

node.js - 如何将自定义 ObjectId 添加到解析服务器对象?

python - 无法获取单个mongo文档

c# - 使用 `in` 运算符从 id 列表中查找所有 MongoDB 文档

c# - MongoDB $geoIntersects 没有在多边形中找到一条完全包含的线,但找到了另一条

mongodb - MongoDB "forEach"命令将在哪里运行?

mongodb - Ubuntu 18.04 - mongodb 5.0 安装 - (代码=转储,信号=ILL)

javascript - aws-serverless-express 连接到 mongo 并获取 mongo 文档

c# - Mongo C# 驱动程序 - 长度支持?

mongodb - findOne 然后 findMany 使用在 findOne 中找到的文档中的值,在单个查询中