簡體   English   中英

需要幫助在 C# 中重構 MongoDB 查詢。 我可以“轉換”一個 BsonDocument 到 IMongoQuery 嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM