2015-01-09 114 views
1

我想下面僅下面的查詢從empActivity返回這些子文件數組,其中每個子文檔中的郵票字段中的郵票值相匹配查詢。 empld and empActivity是具有嵌入文檔的empActivity的外層級字段。MongoDB中僅檢索從文檔匹配的子文件用C#

db.emp_activity.find({$and : [{"empId" : "999"}, {"empActivity.Stamp" : { $lte : ISODate("2015-01-09T12:33:39.927Z")}}]}) 

的問題是,它還會返回不匹配查詢日期的所有子文件,除了有2015年1月9日的日期在第4個個子文件,上面的查詢也返回子文件,其日期比1月9日時,2015年

+2

看看聚合框架。標準查詢和投影將只匹配第一個元素。當你有更多的元素匹配時,你需要聚合框架。 StackOverflow上的很多例子。 –

+0

@NeilLunn再次感謝您的幫助,以及我瞭解的聚合框架,但我想知道我是否可以通過查詢做同樣的事情。聚合框架性能如何明智? – Neville

回答

3

所需的輸出可能只是被合計產生:

在C#
db.collection.aggregate([ 
    {$match : { empId : '999', 'empActivity.Stamp' : { $lte : ISODate("2015-01-09T12:33:39.927Z")} }}, 
    {$unwind : '$empActivity'}, 
    {$match : { empId : '999', 'empActivity.Stamp' : { $lte : ISODate("2015-01-09T12:33:39.927Z")} }}, 
    {$group: { _id: '$empId', empActivity: { $addToSet: '$empActivity' }}} 
]) 

var args = new AggregateArgs 
{ 
    Pipeline = new List<BsonDocument> 
    { 
     BsonDocument.Parse("{$match : { empId : '999', 'empActivity.Stamp' : { $lte : ISODate('2015-01-09T12:33:39.927Z')} }}"), 
     BsonDocument.Parse("{$unwind : '$empActivity'}"), 
     BsonDocument.Parse("{$match : { empId : '999', 'empActivity.Stamp' : { $lte : ISODate('2015-01-09T12:33:39.927Z')} }}"), 
     BsonDocument.Parse("{$group: { _id: '$empId', empActivity: { $addToSet: '$empActivity' }}}"), 
    } 
}; 

var result = collection.Aggregate(args).ToList(); 
+0

感謝您的幫助!非常感謝,就像我之前在我的評論中所說的,我意識到聚合,但只是想弄明白我是否可以用查詢來做到這一點。聚合框架資源密集型嗎?您如何評價其性能? – Neville

+0

彙總速度非常快,特別是在處理少量文檔的情況下(在您的情況下,使用{$ match:{empId:'999'}}會導致在小文檔上執行彙總)http://vladmihalcea.com/ 2013/12/19/mongodb-facts-lightning-speed-aggregation/ – Disposer

+2

@Neville總是值得一提的是,那些新的聚合框架是**總是$匹配第一**。對於甚至不包含數組內容中可能的匹配的文檔,沒有像'$ unwind'這樣的進一步操作。要過濾數組,您可以使用'$ match ... $ unwind .. $ match'來獲得最佳性能。或者用'$ setDifference'或$ $ redact'查看'$ map'以獲取其他方式來過濾數組內容。 –

相關問題