[英]Need help refactoring a MongoDB query in C#. Can I “convert” a BsonDocument to IMongoQuery?
免責聲明:我是個菜鳥,所以請保持溫和。
我正在嘗試重構一個返回 IMongoQuery 對象的方法,該對象的查詢效率不是很高。 我已粘貼以下查詢(原始和所需)。 我已經嘗試了各種構建查詢的方法,但以我有限的知識,我知道如何做的最好方法是手動將其創建為 BsonDocument; 但后來我不知道如何把它變成一個 IMongoQuery。
任何人都可以就我應該采取的最佳方式給我一些指示嗎?
原始查詢
{
"$or": [{
"$and": [{
"$or": [{
"identifier": {
"$elemMatch": {
"code": "CustomerName1",
"system": "NameSystem"
}
}
}, {
"identifier.0": {
"$exists": false
},
"identifier.code": "CustomerName1",
"identifier.system": "NameSystem"
}
]
}, {
"$or": [{
"identifier": {
"$elemMatch": {
"code": "CustomerCode1",
"system": "CodeSystem"
}
}
}, {
"identifier.0": {
"$exists": false
},
"identifier.code": "CustomerCode1",
"identifier.system": "CodeSystem"
}
]
}
]
}, {
"$and": [{
"$or": [{
"identifier": {
"$elemMatch": {
"code": "CustomerName2",
"system": "NameSystem"
}
}
}, {
"identifier.0": {
"$exists": false
},
"identifier.code": "CustomerName2",
"identifier.system": "NameSystem"
}
]
}, {
"$or": [{
"identifier": {
"$elemMatch": {
"code": "CustomerCode2",
"system": "CodeSystem"
}
}
}, {
"identifier.0": {
"$exists": false
},
"identifier.code": "CustomerCode2",
"identifier.system": "CodeSystem"
}
]
}
]
}
]
}
所需查詢
{
"$or": [{
"$and": [{
"$or": [{
"identifier": {
"$elemMatch": {
"code": {
"$in": ["CustomerName1", "CustomerName2"]
},
"system": "NameSystem"
}
}
}, {
"identifier.0": {
"$exists": false
},
"identifier.code": {
"$in": ["CustomerName1", "CustomerName2"]
},
"identifier.system": "NameSystem"
}
]
}, {
"$or": [{
"identifier": {
"$elemMatch": {
"code": {
"$in": ["CustomerCode1", "CustomerCode2"]
},
"system": "CodeSystem"
}
}
}, {
"identifier.0": {
"$exists": false
},
"identifier.code": {
"$in": ["CustomerCode1", "CustomerCode2"]
},
"identifier.system": "CodeSystem"
}
]
}
]
}
]
}
好吧沒關系,我最終用很多 MongoDB.Driver.Builders.Query 來構建它:)
它有效,但如果有人想分享一個更優雅的解決方案,我全神貫注。
var queryList = new List<IMongoQuery>();
queryList.Add(M.Query.In("code", restrictionList));
queryList.Add(M.Query.EQ("system", system));
var query1 = M.Query.ElemMatch("identifier", M.Query.And(queryList));
queryList.Clear();
queryList.Add(M.Query.In("identifer.code", restrictionList));
queryList.Add(M.Query.EQ("identifer.system", system));
queryList.Add(M.Query.NotExists("identifer.0"));
var query2 = M.Query.And(queryList);
queryList.Clear();
queryList.Add(query1);
queryList.Add(query2);
var restrictionQuery = M.Query.Or(queryList);
return restrictionQuery;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.