2014-01-11 73 views
0

假設我們有以下的數據庫集合:有兩個集合的MongoDB加入式查詢和where子句

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的,所以我無法計算出來。我相信這也可以作爲一個單線程來完成。

回答

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 } }); 
+0

確定,該作品,如果我有'變種docnames = [ 'A', 'B']'然後執行'db.fragments.find ({doc_name:{$ in:docnames}})'。但如何從第一個查詢中獲得'docnames'數組? – Timo

+0

我最近的事情是db.documents.find({},{'name':1,'_id':0})。limit(2)',這給了 '{「name」:「A」 } {「name」:「B」}' – Timo

+0

已更新的答案。 –