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

时间:2014-08-06 18:30:15

标签: 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")

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

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

但它没有返回任何结果。所以我采用了嵌套查询并在它上面运行它。我相信的问题是它会回来;

{
    "id":"myMadeUpId"
}

其中 - 假设内部查询首先执行 - 给我查询;

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

当我真正想要id的值时。我尝试使用字典和点符号来访问id的值而没有运气。有没有办法与我上面尝试的查询类似?

3 个答案:

答案 0 :(得分:10)

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

  

删除其中包含memberid的电子邮件(从名称为&#34的成员中选择id; evanmcdonnal")

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

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

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

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

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

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

答案 1 :(得分:1)

至于每个()方式对我没有用,我用以下方法解决了这个问题:

var plzDeleteIds = db.members.find({ "name" : "evanmcdonnal" }, { "id" : 1 }).toArray();
var aux = plzDeleteIds["0"];
var aux2 = aux.map(function(u) { return u.name; } );
db.emails.remove({ "memberid" : { "$in" : aux2 } });

我希望它有所帮助!

答案 2 :(得分:0)

我不相信你要求的是可能的。 MongoDB查询只与一个集合通信 - 没有语法可以进行交叉收集。 但是,以下内容如下: 成员中的名称似乎不是唯一的。如果您要从"电子邮件中删除电子邮件'使用name作为搜索属性的集合,您可能会遇到问题。为什么不在电子邮件集合中存储实际的电子邮件地址?并在成员集合中再次存储电子邮件地址。当您的用户登录时,您将检索其成员记录 - 包括电子邮件地址。当您想删除他的电子邮件时,您已经收到了他的电子邮件,您可以这样做: db.emails.remove({emailAddress:theActualAddress))

这有用吗?