Node.js 如何在MongoDB 2.4中从数组内部的文档中删除属性
在MongoDB 2.4中使用本机Nodejs驱动程序,并尝试从数组中嵌入的文档中删除属性。例如,如何从Node.js 如何在MongoDB 2.4中从数组内部的文档中删除属性,node.js,mongodb,Node.js,Mongodb,在MongoDB 2.4中使用本机Nodejs驱动程序,并尝试从数组中嵌入的文档中删除属性。例如,如何从grades数组中嵌入的所有文档中删除gym属性,其中gym是562e7c1ae6c3e8ce29abfe05?因此: { "_id" : ObjectId("562abaaffb5870b8fb9dca3f"), "grades" : [ { "_id" : ObjectId("562e7bbe70ee82bb290192bd"),
grades
数组中嵌入的所有文档中删除gym
属性,其中gym
是562e7c1ae6c3e8ce29abfe05
?因此:
{
"_id" : ObjectId("562abaaffb5870b8fb9dca3f"),
"grades" : [
{
"_id" : ObjectId("562e7bbe70ee82bb290192bd"),
"discipline" : "55aae5b7848b9c8bf4ecbb5c",
"grade" : "55aae5b7848b9c8bf4ecbb4c",
"gym" : "562e7c1ae6c3e8ce29abfe06",
"registeredOn" : ISODate("2015-10-26T19:15:10.565Z")
},
{
"discipline" : "55aae5b7848b9c8bf4ecbb5c",
"grade" : "55aae5b7848b9c8bf4ecbb4d",
"gym" : "562e7c1ae6c3e8ce29abfe05",
"registeredOn" : ISODate("2015-10-26T19:17:08.603Z"),
"_id" : ObjectId("562e7c34e6c3e8ce29abfe06")
},
{
"discipline" : "55aae5b7848b9c8bf4ecbb5c",
"grade" : "55aae5b7848b9c8bf4ecbb4d",
"gym" : "562e7c1ae6c3e8ce29abfe05",
"registeredOn" : ISODate("2015-10-26T19:17:08.603Z"),
"_id" : ObjectId("562e7c34e6c3e8ce29abfe07")
}
],
},
{
"_id" : ObjectId("562abaaffb5870b8fb9dca3f"),
"grades" : [
{
"_id" : ObjectId("562e7bbe70ee82bb290192bd"),
"discipline" : "55aae5b7848b9c8bf4ecbb5c",
"grade" : "55aae5b7848b9c8bf4ecbb4c",
"gym" : "562e7c1ae6c3e8ce29abfe07",
"registeredOn" : ISODate("2015-10-26T19:15:10.565Z")
},
{
"discipline" : "55aae5b7848b9c8bf4ecbb5c",
"grade" : "55aae5b7848b9c8bf4ecbb4d",
"gym" : "562e7c1ae6c3e8ce29abfe05",
"registeredOn" : ISODate("2015-10-26T19:17:08.603Z"),
"_id" : ObjectId("562e7c34e6c3e8ce29abfe06")
}
],
}
我需要这个:
{
"_id" : ObjectId("562abaaffb5870b8fb9dca3f"),
"grades" : [
{
"_id" : ObjectId("562e7bbe70ee82bb290192bd"),
"discipline" : "55aae5b7848b9c8bf4ecbb5c",
"grade" : "55aae5b7848b9c8bf4ecbb4c",
"gym" : "562e7c1ae6c3e8ce29abfe06",
"registeredOn" : ISODate("2015-10-26T19:15:10.565Z")
},
{
"discipline" : "55aae5b7848b9c8bf4ecbb5c",
"grade" : "55aae5b7848b9c8bf4ecbb4d",
"registeredOn" : ISODate("2015-10-26T19:17:08.603Z"),
"_id" : ObjectId("562e7c34e6c3e8ce29abfe06")
},
{
"discipline" : "55aae5b7848b9c8bf4ecbb5c",
"grade" : "55aae5b7848b9c8bf4ecbb4d",
"registeredOn" : ISODate("2015-10-26T19:17:08.603Z"),
"_id" : ObjectId("562e7c34e6c3e8ce29abfe07")
}
],
},
{
"_id" : ObjectId("562abaaffb5870b8fb9dca3f"),
"grades" : [
{
"_id" : ObjectId("562e7bbe70ee82bb290192bd"),
"discipline" : "55aae5b7848b9c8bf4ecbb5c",
"grade" : "55aae5b7848b9c8bf4ecbb4c",
"gym" : "562e7c1ae6c3e8ce29abfe07",
"registeredOn" : ISODate("2015-10-26T19:15:10.565Z")
},
{
"discipline" : "55aae5b7848b9c8bf4ecbb5c",
"grade" : "55aae5b7848b9c8bf4ecbb4d",
"registeredOn" : ISODate("2015-10-26T19:17:08.603Z"),
"_id" : ObjectId("562e7c34e6c3e8ce29abfe06")
}
],
}
下面的查询将仅删除指定id为I的第一个匹配文档。但是,第二份文档带有“_id”:ObjectId(“562e7c34e6c3e8ce29abfe07”)
仍将具有健身房属性562e7c1ae6c3e8ce29abfe05
multi
似乎是多余的,那么有没有办法删除所有id为I的健身房属性
collections.users.update({
"grades.gym": "562e7c1ae6c3e8ce29abfe05"
}, {
$unset: {
"grades.$.gym": "562e7c1ae6c3e8ce29abfe05"
}
}, {
multi: true
})
最好使用返回光标,使用方法对其进行迭代,以访问集合中符合条件的每个文档,从而获得数组字段,删除符合条件的属性并更新文档,如下所示:
collection.find({ "grades.gym": "562e7c1ae6c3e8ce29abfe05" }).each(function(err, doc){
// handle err
var new_grades = doc.grades.map(function (grade){
if (grade.gym == "562e7c1ae6c3e8ce29abfe05") { delete grade.gym; }
return grade;
});
collection.update({ "_id": doc._id },{ "$set": { "grades": new_grades }});
});