2015-01-09 78 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'以获取其他方式来过滤数组内容。 –

相关问题