我希望下面的查询仅返回 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月。
答案 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();