我收集了志愿者信息,并将志愿者列为一系列对象。我可以显示每个志愿者的所有班次,但从阵列中删除一个对我来说很难:
示例数据:
"_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号中午换班。她也可能被列入其他轮班,但我们只想将她从这个转变中移除。
答案 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
)