【问题标题】:mongodb join-like query with two collections and a where clause具有两个集合和一个 where 子句的 mongodb 类连接查询
【发布时间】:2014-01-11 20:26:37
【问题描述】:

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

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'}])

其中documents 集合存储文档的名称(以及此示例中省略的其他内容),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 很陌生,所以我很难弄清楚。我相信这也可以作为单线来完成。

【问题讨论】:

    标签: mongodb join where


    【解决方案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 } } ); 
    

    【讨论】:

    • 好的,如果我有var docnames = ['A', 'B'],然后执行db.fragments.find({doc_name: {$in: docnames}}),那就行了。但是如何从第一个查询中得到docnames数组呢?
    • 我最接近的是&gt; db.documents.find({}, {'name': 1, '_id': 0}).limit(2),它给出了{ "name" : "A" } { "name" : "B" }
    猜你喜欢
    • 2023-03-28
    • 2019-06-16
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    相关资源
    最近更新 更多