mongo查询中的组合(SQL子查询等效)

eva*_*nal 4 composition mongodb

例如,我有几个收藏品;

members
   id
   name
   //other fields we don't care about
emails
   memberid
   //other fields we don't care about
Run Code Online (Sandbox Code Playgroud)

我想删除给定成员的电子邮件.在SQL中,我可以使用嵌套查询,例如;

delete emails
where memberid in (select id from members where name = "evanmcdonnal")
Run Code Online (Sandbox Code Playgroud)

在蒙戈我正在尝试这样的事情;

db.emails.remove( {"memberid":db.members.find( {"name":"evanmcdonnal"}, {id:1, _id:0} ) )
Run Code Online (Sandbox Code Playgroud)

但它没有返回任何结果.所以我采用嵌套查询并自行运行它.我相信的问题是它会回归;

{
    "id":"myMadeUpId"
}
Run Code Online (Sandbox Code Playgroud)

哪个 - 假设内部查询首先执行 - 给我一个查询;

db.emails.remove( {"memberid":{ "id""myMadeUpId"} )
Run Code Online (Sandbox Code Playgroud)

我真的只想要id的值.我已经尝试使用字典和点符号来访问id的值而没有运气.有没有办法做到这一点类似于我上面尝试的查询?

wdb*_*ley 10

让我们看看你是如何粗略翻译的

删除其中memberid的电子邮件(从name ="evanmcdonnal"的成员中选择id)

进入一组mongo shell操作.您可以使用:

db.members.find({ "name" : "evanmcdonnal" }, { "id" : 1 }).forEach(function(doc) {
    db.emails.remove({ "memberid" : doc.id });
});
Run Code Online (Sandbox Code Playgroud)

但是,这会从中删除每个结果文档的查询members.您可以将members结果推id送到数组并使用$in:

var plzDeleteIds = db.members.find({ "name" : "evanmcdonnal" }, { "id" : 1 }).toArray();
db.emails.remove({ "memberid" : { "$in" : plzDeleteIds } });
Run Code Online (Sandbox Code Playgroud)

但如果plzDeleteIds变得非常非常大,这可能是一个问题.你可以批量.在所有情况下,我们需要对数据库执行多个请求,因为我们正在查询多个集合,这些集合总是需要MongoDB中的多个操作(无论如何,从2.6开始).

在MongoDB中执行此类事物的更惯用的方法是将电子邮件集合中所需的成员信息存储在电子邮件文档中,可能作为子文档.我不能确切地说你是否以及如何做到这一点,因为你只提供了一些显然已理想化的数据模型.