Mongodb mongo查询中的组合(相当于SQL子查询)

Mongodb mongo查询中的组合(相当于SQL子查询),mongodb,composition,Mongodb,Composition,例如,我有一些收藏 members id name //other fields we don't care about emails memberid //other fields we don't care about 我想删除给定成员的电子邮件。在SQL中,我可以使用嵌套查询,比如 delete emails where memberid in (select id from members where name = "evanmcdonnal") 在mo

例如,我有一些收藏

members
   id
   name
   //other fields we don't care about
emails
   memberid
   //other fields we don't care about
我想删除给定成员的电子邮件。在SQL中,我可以使用嵌套查询,比如

delete emails
where memberid in (select id from members where name = "evanmcdonnal")
在mongo,我正在尝试这样的事情

db.emails.remove( {"memberid":db.members.find( {"name":"evanmcdonnal"}, {id:1, _id:0} ) )
但它没有返回任何结果。因此,我接受了嵌套查询并自己运行它。我认为问题是它会回来

{
    "id":"myMadeUpId"
}
假设先执行内部查询,这会给我一个查询

db.emails.remove( {"memberid":{ "id""myMadeUpId"} )

当我真的想要id的值时,我尝试使用字典和点符号来访问id的值,但运气不好。有没有类似于我上面尝试的查询的方法?

我不相信您所要求的是可能的。MongoDB查询只与一个集合通信——没有语法可以跨集合进行。 但是,以下情况如何: 成员中的名称似乎不是唯一的。如果使用“名称”作为搜索属性从电子邮件集合中删除电子邮件,则可能会出现问题。为什么不将实际的电子邮件地址存储在电子邮件集合中?并在成员集合中再次存储电子邮件地址。当您的用户登录时,您将检索到他的会员记录-包括电子邮件地址。当您想删除他的电子邮件时,您已经收到他的电子邮件,您可以执行以下操作: db.emails.remove{emailAddress:theActualAddress


这行吗?

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

从name=evanmcdonnal的成员中删除memberid位于select id中的电子邮件

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

db.members.find({ "name" : "evanmcdonnal" }, { "id" : 1 }).forEach(function(doc) {
    db.emails.remove({ "memberid" : doc.id });
});
但是,这会从成员中删除每个结果文档的查询。您可以将成员结果ID推送到数组中,并使用$in:

但如果plzDeleteIds变得非常非常大,这可能会成为一个问题。您可以批处理。在所有情况下,我们都需要对数据库执行多个请求,因为我们要查询多个集合,无论如何,从2.6开始,MongoDB中总是需要多个操作


在MongoDB中,更惯用的方法是将您需要的成员信息存储在电子邮件文档的电子邮件集合中,可能作为子文档。我不能确切地说您是否应该这样做,以及如何这样做,因为您只给出了一小部分显然已经理想化的数据模型。

as forEach way没有为我工作我使用以下方法解决了此问题:

var plzdeletids=db.members.find{name:evanmdonnal},{id:1}.toArray; var aux=plzDeleteIds[0]; var aux2=aux.mapfunctionu{return u.name;}; 删除{memberid:{$in:aux2};
我希望它能有所帮助!

我建立的数据模型是假的。实际上,我处理的是不同类型的实体,内部查询只返回一条记录,在大多数情况下,可能甚至不需要查找,但如果不查找,应该删除的数据中会有一小部分丢失。
var plzDeleteIds = db.members.find({ "name" : "evanmcdonnal" }, { "id" : 1 }).toArray();
db.emails.remove({ "memberid" : { "$in" : plzDeleteIds } });