具有两个集合和where子句的mongodb join-like查询

 无心伤害2502907297 发布于 2023-02-04 13:47

假设我们在数据库中有以下集合:

db.documents.insert([{'name': 'A'}, {'name': 'B'}, {'name': 'C'}])
db.fragments.insert([{'value:': 'A1', doc_name: 'A'}, {'value:': 'A2', doc_name: 'A'},
                     {'value:': 'B1', doc_name: 'B'}, {'value:': 'B2', doc_name: 'B'},
                     {'value:': 'C1', doc_name: 'C'}, {'value:': 'C2', doc_name: 'C'}])

其中documentscollection存储文档的名称(以及本示例中省略的其他内容),fragments集合引用doc_name与该片段相关的文档.

现在,如果我只想考虑一部分文件

> db.documents.find().limit(2)
{ "_id" : ObjectId("52d1a3bf49da25160ad6f076"), "name" : "A" }
{ "_id" : ObjectId("52d1a3bf49da25160ad6f077"), "name" : "B" }

那我怎么能看到与这些选定文件相关联的片段,所以我会得到

{ "_id" : ObjectId("52d1a3bf49da25160ad6f079"), "value:" : "A1", "doc_name" : "A" }
{ "_id" : ObjectId("52d1a3bf49da25160ad6f07a"), "value:" : "A2", "doc_name" : "A" }
{ "_id" : ObjectId("52d1a3bf49da25160ad6f07b"), "value:" : "B1", "doc_name" : "B" }
{ "_id" : ObjectId("52d1a3bf49da25160ad6f07c"), "value:" : "B2", "doc_name" : "B" }

作为一个解决方案,我认为我应该将文档名称存储在一个数组中,就像var docnames = ???这样

> docnames
[ "A", "B" ]

然后尝试在where子句中使用此数组,例如

> db.fragments.find({$where: function(x) { return (this.doc_name in docnames)}})
error: {
        "$err" : "ReferenceError: docnames is not defined near 'c_name in docnames)}' ",
        "code" : 16722
}

但由于我对mongodb很新,所以我很难搞清楚.我相信这也可以作为一个单行程来完成.

1 个回答
  • db.fragments.find( { 'doc_name': { $in : ['A' , 'B'] } } ); 
    

    执行以下命令mongo:

    var f = db.documents.find().limit(2) , n = [];
    for (var i = 0; i < f.length(); i++) n.push(f[i]['name']);
    db.fragments.find( { 'doc_name': { $in : n } } ); 
    

    2023-02-04 13:50 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有