【问题标题】:Need help refactoring a MongoDB query in C#. Can I "convert" a BsonDocument to IMongoQuery?需要帮助在 C# 中重构 MongoDB 查询。我可以将 BsonDocument“转换”为 IMongoQuery 吗?
【发布时间】:2021-07-09 00:42:24
【问题描述】:

免责声明:我是一个完全的菜鸟,所以请温柔。

我正在尝试重构一个返回 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"
                        }
                    ]
                }
            ]
        }
    ]
}

【问题讨论】:

标签: c# mongodb search


【解决方案1】:

好吧,没关系,我最终用很多 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多