我收集了包含志愿者信息的集合,并将志愿者列为对象数组。我可以显示每个志愿者的所有班次,但从数组中删除一个对我来说很困难:
样本数据:
"_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" : "[email protected]",
"_id" : ObjectId("591ce45bc7e8a8c7b742474c")
}
]
},
我可用的数据是:
_id,哪里,shifts.timeslot,shifts.dateNeeded,志愿者.email
有人能帮我吗?假设玛丽·麦克 (Mary Mack) 不想参加商品帐篷的中午 8 点轮班。她也可能列在其他班次下,但我们只想将她从该班次中删除。
您可以通过指定与“文档”匹配的内容,然后指定所需的“shifts”数组条目作为查询表达式来完成此操作.update()
。然后应用位置性的$操作员对于匹配的数组索引$pull:
db.collection.update(
{ "_id": ObjectId("59180305c19dbaa4ecd9ee59"), "shifts.timeslot": "8:00 - NOON" },
{ "$pull": { "shifts.$.volunteers": { "fullname": "Mary Mack" } } }
)
在这种情况下这是可以的,因为您只是尝试“匹配”嵌套结构中的“外部”数组和$pull有自己的查询参数来标识要删除的数组条目。
不过,您确实应该小心使用“嵌套数组”。正如同时$pull像这样的操作有效,更新“内部”数组实际上是不可能的,因为位置性的$操作员只会匹配满足条件的“第一个”元素。因此,您在多个班次中的“Mary Mack”示例将仅在找到的第一个“班次”数组条目中匹配。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)