2015-11-20 96 views
0

MongoDB中比較文檔字段我有類似下面的文檔的集合:聚集管道

{ name : "John" , 
    age : 25.0 , 
    bornIn : "Milan" , 
    city : [ { 
     name : "Roma" , 
     state : "IT" , 
     mayor : "John" 
     }] 
} 
{ name : "Jim" , 
    age : 35.0 , 
    bornIn : "Madrid" , 
    city : [ { 
     name : "Madrid" , 
     state : "ESP" , 
     mayor : "Jim" 
     }] 
} 

我想檢索所有具有場$ bornIn等於場$ city.name的文件。我需要做這個作爲管道的中間階段,所以我不能使用$ where操作符。

我在網上搜索,我發現了一個建議,實施這樣的事情:

{ $project: 
     { matches: 
      { $eq:[ '$bornIn', '$city.name' ] } 
     } 
    }, 
    { $match: 
     { matches:true } 

    }) 

但因爲它標誌着領域的不同它沒有既不通過shell也通過Java驅動程序。 爲了完整起見,我報我的代碼:

final DBObject eq = new BasicDBObject(); 
LinkedList eqFields = new LinkedList(); 
eqFields.add("$bornIn"); 
eqFields.add("$city.name"); 
eq.put("$eq", eqFields); 
projectFields.put("matches", eq); 
final DBObject proj = new BasicDBObject("$project", projectFields); 
LinkedList agg = new LinkedList(); 
agg.add(proj); 
final AggregationOutput aggregate = table.aggregate(agg); 

你有什麼建議嗎?我正在使用MongoDB 3.2,並且需要通過Java Driver來完成。

謝謝!

PS。這是不相關的,但實際上上面的文件是集合「城市」和「人員」之間的$ lookup階段的輸出,加入$ name/$市長..它是超級酷! :d:d

回答

1

我在蒙戈如何與深平等搜索對象的數組交易有點生疏,但這是$unwind

db.foo.aggregate([ 
    {$unwind: "$city"}, 
    { $project: 
     { matches: 
      { $eq:[ '$bornIn', '$city.name' ] } 
     } 
    }, 
    { $match: 
     { matches:true } 

    } 
]); 

我不是蒙戈的計算機上肯定可行權現在,所以我的語法可能會有點偏離。

+0

Yeeeeeess !!它解決了我的問題!我完全忘記了$ unwind操作符的存在!謝謝,謝謝,謝謝! – cartoonheart91

+0

@ cartoonheart91沒問題。不要忘記upvote所以我可以駭莫網絡點 –

+0

我試圖弄清楚這一點,沒有想到$ unwind。尼斯。 – inspired