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

例如,我有几个系列;

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 的值,但没有成功。有没有一种类似于我上面尝试的查询的方法?

解答

让我们看看你会如何大致翻译

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

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

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

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

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

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

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

Logo

MongoDB社区为您提供最前沿的新闻资讯和知识内容

更多推荐