MongoDB使用c#从文档中仅检索匹配的子文档

时间:2015-01-09 14:09:24

标签: mongodb c#-4.0 mongodb-query mongodb-.net-driver

我希望下面的查询仅返回 empActivity 数组中的子文档,其中每个子文档中的标记字段与图章查询中的值。 empId empActivity 是具有 empActivity 并具有嵌入文档的外层字段。

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

问题是它还返回了与查询中的日期不匹配的所有子文档,除了日期为2015年1月9日的4个子文档之外,上面的查询还返回日期大于9的子文档2015年1月。

1 个答案:

答案 0 :(得分:3)

只需通过聚合即可生成所需的输出:

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' }}}
])

在c#中:

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();