首页 > 解决方案 > 如何根据匹配的字段在 MongoDB 中搜索特定字段

问题描述

我正在使用 C# 驱动程序来查询 mongo DB。我正在尝试创建一种方法来搜索我的两个对象之间的链接。

我创建了一些链接项目,如下所示..

    "linkResults": [
        {
            "id": "5dc54231f8da9dcc9f62f399",
            "createdAt": "2019-11-08T10:23:45Z",
            "leftDatabase": "sampledb",
            "leftCollection": "donald",
            "leftId": "5d7a762786ce3502bd2afb5a",
            "rightDatabase": "test",
            "rightCollection": "samplecities",
            "rightId": "5d7f85efe9a1ec580afc73d1",
            "relationshipId": 1,
            "relationshipDescription": "address of"
        }
    ],

如果将与左侧 ID 匹配的 ID 传递给方法,我只想搜索右侧的字段(反之亦然)。

这是传递给我的方法的参数

    public class ItemLinkParameters
    {
        public int Page { get; set; } = 1;
        public int PageLimit { get; set; } = 20;
        public string Id { get; set; } = null;
        public ICollection<string> Database { get; set; } = new List<string>();
        public ICollection<string> Collection { get; set; } = new List<string>();
        public ICollection<long?> RelationshipId { get; set; } = new List<long?>();
    }

这是我到目前为止所得到的,但目前它搜索双方

        //THIS METHOD NEEDS TO EVALUATE WHETHER THE ITEM SUPPLIED IS ON THE LEFT OR RIGHT SIDE, THEN ONLY SEARCH THE OTHER SIDE
        internal async Task<ICollection<Link>> getItemLink(ItemLinkParameters parameters, string db, string collection)
        {
            //gets mongo connection string and database name from the
            //MongoDatabaseSettings class which gets it from appsettings.json
            var client = new MongoClient(_dbsettings.ConnectionString);
            var database = client.GetDatabase(db);

            //uses the name from MongoCollectionName variable, set by MongoDatabaseSettings.cs, again supplied from appsettings.json
            var _linkDocs = database.GetCollection<Link>(collection);

            var filter = Builders<Link>.Filter.Empty;

            if (parameters.Id != null)
                filter &= Builders<Link>.Filter.Eq(x => x.LeftId, parameters.Id) | Builders<Link>.Filter.Eq(x => x.RightId, parameters.Id);

            if (parameters.Database != null && parameters.Database.Count() > 0)
                filter &= Builders<Link>.Filter.In(x => x.LeftDatabase, parameters.Database) | Builders<Link>.Filter.In(x => x.RightDatabase, parameters.Database);

            if (parameters.Collection != null && parameters.Collection.Count() > 0)
                filter &= Builders<Link>.Filter.In(x => x.LeftCollection, parameters.Collection) | Builders<Link>.Filter.In(x => x.RightCollection, parameters.Collection);

            if (parameters.RelationshipId != null && parameters.RelationshipId.Count() > 0)
                filter &= Builders<Link>.Filter.In(x => x.RelationshipId, parameters.RelationshipId);


            // get data with paging
            var qry = _linkDocs.Find(filter)
                .Skip((parameters.Page - 1) * parameters.PageLimit)
                .Limit(parameters.PageLimit);

            var data = await qry.ToListAsync();

            return data;


        }

我知道当我使用过滤器查询数据库时,结果实际上只是最后从数据库返回。所以我无法理解如何评估在此之前哪个字段有匹配。我是在正确的路线上还是需要完全重新设计?

标签: c#mongodbmongodb-query

解决方案


我已经设法让它工作 - 这是我的解决方案

internal async Task<ICollection<Link>> getItemLink(ItemLinkParameters parameters, string db, string collection)
        {
            //gets mongo connection string and database name from the
            //MongoDatabaseSettings class which gets it from appsettings.json
            var client = new MongoClient(_dbsettings.ConnectionString);
            var database = client.GetDatabase(db);

            //uses the name from MongoCollectionName variable, set by MongoDatabaseSettings.cs, again supplied from appsettings.json
            var _linkDocs = database.GetCollection<Link>(collection);

            var leftFilter = Builders<Link>.Filter.Eq(x => x.LeftId, parameters.Id);
            var rightFilter = Builders<Link>.Filter.Eq(x => x.RightId, parameters.Id);



            if (parameters.Database != null && parameters.Database.Count() > 0)
            {
                leftFilter &= Builders<Link>.Filter.In(x => x.RightDatabase, parameters.Database);
                rightFilter &= Builders<Link>.Filter.In(x => x.LeftDatabase, parameters.Database);
            }

            if (parameters.Collection != null && parameters.Collection.Count() > 0)
            {
                leftFilter &= Builders<Link>.Filter.In(x => x.RightCollection, parameters.Collection);
                rightFilter &= Builders<Link>.Filter.In(x => x.LeftCollection, parameters.Collection);
            }


            // get data with paging
            var filter = Builders<Link>.Filter.Or(leftFilter, rightFilter);

            if (parameters.RelationshipId != null && parameters.RelationshipId.Count > 0)
            {
                filter &= Builders<Link>.Filter.In(x => x.RelationshipId, parameters.RelationshipId);
            }

            var qry = _linkDocs.Find(filter)
                .Skip((parameters.Page - 1) * parameters.PageLimit)
                .Limit(parameters.PageLimit);

            var data = await qry.ToListAsync();

            return data;


        }

推荐阅读