假设我们在数据库中有以下集合:
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很新,所以我很难搞清楚。我相信这也可以作为一个班轮来完成。
答案 0 :(得分:5)
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 } } );