例如,我有一些收藏。
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的值,但是没有运气。有没有一种方法与我上面的尝试查询类似?
让我们看看您如何大致翻译
删除成员为的电子邮件(从名称为“ evanmcdonnal”的成员中选择ID)
进入一组mongo shell操作。您可以使用:
db.members.find({ "name" : "evanmcdonnal" }, { "id" : 1 }).forEach(function(doc) {
db.emails.remove({ "memberid" : doc.id });
});
但是,这确实从中删除了对每个结果文档的查询members
。您可以将members
结果id
s放入数组并使用$in
:
var plzDeleteIds = db.members.find({ "name" : "evanmcdonnal" }, { "id" : 1 }).toArray();
db.emails.remove({ "memberid" : { "$in" : plzDeleteIds } });
但是如果plzDeleteIds
变得非常大,那可能是个问题。你可以批处理。在所有情况下,我们都需要对数据库执行多个请求,因为我们要查询多个集合,这在MongoDB中始终需要进行多个操作(无论如何从2.6开始)。
在MongoDB中执行此类操作的更惯用的方法是将您需要的成员信息存储在电子邮件文档中的电子邮件集合中(可能作为子文档)。我无法确切地说出是否应该以及如何进行此操作,因为您只给出了显然已经理想化的数据模型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句