MongoDB 使用 c# 从文档中仅检索匹配的子文档
MongoDB retrieve only matching sub documents from a document with c#
我希望下面的查询仅 return 来自 empActivity 数组的那些子文档,其中 Stamp 字段在每个子文档都匹配查询中的 Stamp 值。 empId 和 empActivity 是具有嵌入文档的 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();
我希望下面的查询仅 return 来自 empActivity 数组的那些子文档,其中 Stamp 字段在每个子文档都匹配查询中的 Stamp 值。 empId 和 empActivity 是具有嵌入文档的 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();