2016-03-08 83 views
0

如何编写一个嵌套查询涉及两个集合。mongodb脚本用于删除两个集合中的文档

例如我有学生和作业集合。

Student: 

{ 
"_id":"556", 
"name":"sam", 
"assignment":[{"2","3"}] 
} 

Assignment: 
{ 
"_id":"2", 
"name":"math" 
} 

{ 
"_id":"3", 
"name":"english" 
} 

我如何可以编写一个脚本,当学生ID = 556删除,相关转让文件也得到删除

这是集合的样子JSON格式,

{ 
    "_id" : "123", 
    "media" : [ 
     "33", 
     "44" 
    ], 
    "sectionId" : "dd", 
    "courseId" : "string", 
    "startDate" : "string", 
    "endDate" : "string", 
    "title" : "string" 
} 

所以我想要获得媒体ID并在$中使用它

回答

1

在删除学生之前,请在列表中获取赋值id,然后将该数组用作删除文档的查询s在作业集合中。东西 像下面的操作:

// Get assignmentIds = ["2", "3"] 
var assignmentIds = db.student.findOne({"_id": "556"}).assignment; 
// Delete student 
db.student.remove({"_id": "556"}); 
// Delete associated assignments 
db.assignment.remove({ "_id": { "$in": assignmentIds } }); 

假如你有一个返回多个文档,并且需要使用find(),而不是findOne()则需要由find()返回iterate the cursor查询标准函数,将每个文档的代理id加载到一个数组中,然后在删除操作中使用它。

使用上述相同的例子,则可以使用forEach()光标方法来迭代光标,串联使用原生JavaScript的Array.concat()方法assignement ids数组。考虑下面的例子:

// Get assignment ids 
var assignmentIds = []; 
db.student.find({"firstName": "Jane"}).forEach(function (doc){ 
    assignmentIds = assignmentIds.concat(doc.assignment); 
}); 

// print the array 
printjson(assignmentIds); 

// Delete students 
db.student.remove({"firstName": "Jane"}); 

// Delete associated assignments 
db.assignment.remove({ "_id": { "$in": assignmentIds } }); 
+0

@Harshana这甚至不是一个有效的BSON文档。你可以编辑你的问题来包含用'db.student.findOne({“_ id”:“556”})查询返回的实际文档,因为'{“2”,“3”}'甚至不是有效的目的。 – chridam