我正在尝试使用LINQ查询mongodb集合。 我的文档具有以下结构:
{
"_id": ObjectId("593fe10f37ce000d844e8972"),
"MRN": "00038063"
"Family_Name": "SALAMOUN"
"First_Name": "SABINE"
"Maiden_Name": ""
"Mother_Name": "RANDA"
"Spouse_Name": ""
"Address": "Naccache"
}
从C#方面,我创建了一个具有以下结构的类:
public class cls_Patient{
public string MRN;
public string Family_Name;
public string First_Name;
public string Father_Name;
public string Spouse_Name;
public string Address;
}
注意,MongoDB文档中缺少father_name字段,并在类级别创建为字段,以模拟数据模型更改(同一集合中的文档可能具有不同的结构
查询代码:
var client = new MongoClient("mongodb://183.183.183.122");
var db = client.GetDatabase("HISEA");
var col2 = db.GetCollection<cls_Patient>("tbl_Patients");
var names = col2.AsQueryable().
Where(patient => patient.MRN == MFNO &&patient.Father_Name != "")
.OrderBy(patient => patient.First_Name)
.ThenBy(patient => patient.Family_Name);
最新的指令查询了father_name字段并抛出以下异常:
“找不到匹配的创作者”
我尝试过使用
BsonClassMap.RegisterClassMap<cls_Patient>(cm =>
{
cm.AutoMap();
cm.SetIgnoreExtraElements(true);
});
我也用过
MongoDB.Bson.Serialization.Attributes.BsonIgnoreExtraElements]
在类定义之上,但两种方法都不起作用。
感谢任何帮助。
答案 0 :(得分:0)
这是一个有效的例子。请注意,我无法使用您提供的代码重现您的错误消息。
如果您拥有上面发布的数据库中的确切数据,那么MongoDB查询将产生一个结果。这似乎有点令人惊讶,但它是有道理的,因为您的示例数据没有&#34; Father_Name&#34;领域。所以,当你要求所有患者使用&#34; Father_Name&#34;值不等于空字符串(patient.Father_Name != ""
)MongoDB会找到你的记录,因为它的&#34; Father_Name&#34;值不存在,因此不等于空字符串。
using MongoDB.Bson.Serialization.Conventions;
using MongoDB.Driver;
using System;
using System.Linq;
namespace ConsoleApp1
{
public class cls_Patient
{
public string MRN;
public string Family_Name;
public string First_Name;
public string Father_Name;
public string Spouse_Name;
public string Address;
}
public class Program
{
static void Main(string[] args)
{
ConventionPack p = new ConventionPack();
p.Add(new IgnoreExtraElementsConvention(true));
ConventionRegistry.Register("Ignore extra elements", p, _ => true);
var collection = new MongoClient().GetDatabase("test").GetCollection<cls_Patient>("Person");
var names = collection.AsQueryable().
Where(patient => patient.MRN == "00038063" && patient.Father_Name != "")
.OrderBy(patient => patient.First_Name)
.ThenBy(patient => patient.Family_Name).ToList();
Console.ReadLine();
}
}
}