c# - 如何根据匹配的字段在 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;
}
我知道当我使用过滤器查询数据库时,结果实际上只是最后从数据库返回。所以我无法理解如何评估在此之前哪个字段有匹配。我是在正确的路线上还是需要完全重新设计?
解决方案
我已经设法让它工作 - 这是我的解决方案
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;
}
推荐阅读
- python - pyopencl 输出的值错误
- javascript - 强制更改字符串遵守 Typescript 类型联合
- c++ - 如何调试“ISO C++ 禁止指针和整数之间的比较”
- oracle - 如何在 PostgreSQL 中为用户创建同义词
- python - Discord bot 无法使用线程,卡住错误:必需的位置参数:'ctx'
- openstack - 在 Openstack 中使用 Heat 配置网络 MTU
- python-3.x - 使用 google drive 安装 google collab
- javascript - 当对象在多个其他对象中时,console.log 返回 [Object]
- python - 如何对 DataFrame 中的数据进行分组并显示该组中的行数?
- javascript - 将 javascript 动态内容绑定到另一个 javascript 动态内容