在将MongoDB查询转换为C#查询时,我需要一些帮助。这是我的模式:
public class Planner
{
public ObjectId Id { get; set; }
public string PlannerName { get; set; }
public string EditorName { get; set; }
public DateTime DateModified { get; set; }
public List<PlannerDayModel> PlannerDays { get; set; }
}
public class PlannerDayModel
{
public int WeekDay { get; set; }
public string WeekDayStr { get; set; }
public int Month { get; set; }
public int Year { get; set; }
public int MonthDay { get; set; }
public DateTime TimeStamp { get; set; }
public bool IsWeekend { get; set; }
public bool IsHoliday { get; set; }
public PlannerFreeTextModel FreeTextBox1 { get; set; }
public PlannerFreeTextModel FreeTextBox2 { get; set; }
public List<PlannerEventModel> Events { get; set; }
}
public class PlannerEventModel
{
public int EventRowId { get; set; }
public string EventName { get; set; }
public bool IsSeries { get; set; }
public int? Episode { get; set; }
public int? Season { get; set; }
public bool? IsCustom{ get; set; }
}
public class PlannerFreeTextModel
{
public int EventRowId { get; set; }
public string Text { get; set; }
}我正在尝试获取所有的Planner,其中嵌套的集合Events具有一个事件名为x的事件。
这个MongoDB查询工作得很好:
db.Planner.aggregate([
{ "$match": { "planners.events.eventName": "X" } },
{ "$project":
{"dateModified":1, "editorName":1,"plannerName":1,
"planners": {
"$filter": {
"input": {
"$map": {
"input": "$planners",
"as": "planner",
"in": {
"weekDay": "$$planner.weekDay",
"weekDayStr":"$$planner.weekDay",
"events": {
"$filter": {
"input": "$$planner.events",
"as": "event",
"cond": {
"$eq": ["$$event.eventName", "X" ]
}
}
}
}
}
},
"as": "planner",
"cond": { "$ne": [ "$$planner.events", []]}
},
}
}}
])但我只是找不到与之等价的C#驱动程序查询。
我尝试了这个,它抛出了“无法确定表达式的序列化信息”的错误。
var projection = Builders<Planner>.Projection
.Include(x => x.PlannerDays
.Find(p => p.Events.FirstOrDefault(e => e.EventName == eventName) != null))
.Include(x => x.DateModified)
.Include(x => x.EditorName)
.Include(x => x.Id)
.Include(x => x.PlannerName);
var res = collection
.Aggregate()
.Match(Builders<Planner>.Filter.Eq("planners.events.eventName", eventName))
.Project<Planner>(projection)
.ToList();发布于 2018-09-10 08:01:34
我觉得你让事情变得复杂了。首先,您可以通过在ToString查询的末尾编写c# ()来检查查询。例:
collection.Aggregate()
.Match(Builders<Planner>.Filter.Eq("planners.events.eventName", eventName))
.Project<Planner>(projection)
.ToString();第二件事,让我们回到你的问题,所以你希望所有的规划者有一个条件。你可以做到这一点。首先,您的过滤器应该是:
var filter = Builders<BsonDocument>.Filter.Eq("Planner.PlannerDayModel.PlannerEventModel.eventName", "X");现在来了您的聚合查询:
var aggregate = collection.Aggregate(new AggregateOptions { AllowDiskUse = true })
.Unwind("Planner")
.Unwind("Planner.PlannerDayModel")
.Unwind("Planner.PlannerDayModel.PlannerEventModel")
.Unwind("Planner.PlannerDayModel.PlannerEventModel.eventName")
.Match(filter)
;现在这将是您的c#查询。您可以通过以下操作来检查您的模式:
aggregate.ToString();现在让我们执行查询。
List<JObject> objList = new List<JObject>();
foreach (var agg in aggregate.ToList())
{
JObject obj = new JObject();
var str = agg.ToString();
objList.Add(obj);
}您将在objList中获得规划师的所有数据。除此之外,您还可以根据需要使用项目。
请随时纠正我。
编辑:添加项目
var pro = new BsonDocument {
{"PlannerName", true },
{"EditorName", true },
{"DateModified", true },
{"PlannerDays", true }
};现在,聚合查询将如下所示:
var aggregate = collection.Aggregate(new AggregateOptions { AllowDiskUse = true })
.Unwind("Planner")
.Unwind("Planner.PlannerDayModel")
.Unwind("Planner.PlannerDayModel.PlannerEventModel")
.Unwind("Planner.PlannerDayModel.PlannerEventModel.eventName")
.Match(filter)
.Project(pro)
;希望能帮上忙。:)
https://stackoverflow.com/questions/42340113
复制相似问题