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

MongoDB retrieve only matching sub documents from a document with c#

我希望下面的查询仅 return 来自 empActivity 数组的那些子文档,其中 Stamp 字段在每个子文档都匹配查询中的 Stamp 值。 empIdempActivity 是具有嵌入文档的 empActivity 的外层字段。

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

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

只需聚合即可产生所需的输出:

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