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

时间:2017-05-23 02:16:36

标签: 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,shifting.timeslot,shifting.dateNeeded,volunteers.email

有人能帮助我吗?让我们说,玛丽麦克想要在商品帐篷的8号中午换班。她也可能被列入其他轮班,但我们只想将她从这个转变中移除。

2 个答案:

答案 0 :(得分:3)

您可以通过指定与“document”匹配的内容然后将所需的“shift”数组条目作为.update()的查询表达式来执行此操作。然后将匹配数组索引的positional $ operator应用于$pull

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

在这个例子中没问题,因为你只是试图在嵌套结构中的“外部”数组上“匹配”,而$pull有自己的查询参数来标识要删除的数组条目。 / p>

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

答案 1 :(得分:1)

试试这个

db.example.update(
 {},
 { $unset: {"Mary Mack":1}},
 false, true
)