繁体   English   中英

使用C#驱动程序查询mongodb无法正常工作

[英]Query mongodb with C# driver not working

从互联网上粘贴示例来查询我们的mongodb并寻找一个字段时,我有以下错误。

我看不出我做错了什么,想想如果我不能很快解决它我会回到SQL :(

我只想说能找到带3扇门的汽车。

谢谢你的帮助! 非常感激。

连接代码

public MongoDatabase GetDatabase
{
    get
    {
        MongoClient mc = new MongoClient();
        var server = mc.GetServer();
        return server.GetDatabase("players");
    }
 }

代码示例

var numberOfDoors = 3;

var collection = GetDatabase.GetCollection<CarCollection>("Cars");

// Have tried using my Car object instead of BsonDocument but little difference
var filter = Builders<BsonDocument>.Filter.Eq("NumberOfDoors", numberOfDoors);

var result = collection.Find(filter);

错误信息

Argument 1: cannot convert from 'MongoDB.Driver.FilterDefinition<MongoDB.Bson.BsonDocument>' to 'MongoDB.Driver.IMongoQuery'

文件结构

{
    "_id" : ObjectId("..."),
    "Members" : [ 
        {
            "EmailAddress" : "",
            ...
        }, 
        {
            "EmailAddress" : "",
            ...
        }, 
        {
            "EmailAddress" : "",
            ...
        }
    ]
}

C#结构

public class MemberCollection
{
    public ObjectId _id { get; set; }

    public MemberEntity[] Members { get; set; }
}

public class MemberEntity
{
    public int _id { get; set; }

    public string Password { get; set; }

    public string EmailAddress { get; set; }
}

更新 - 显示错误消息

在此输入图像描述

文件结构

在此输入图像描述

更新#2

在此输入图像描述

更新3

在此输入图像描述

你的下线错了

Builders<BsonDocument>.Filter.Eq("NumberOfDoors", numberOfDoors);

它应该在下面,因为你试图在CarCollection上放置一个过滤器。 这是错误的根源。

Builders<CarCollection>.Filter.Eq("NumberOfDoors", numberOfDoors);

根据您最近的编辑,您应该将过滤器定义更改为下面,因为您实际上是尝试将过滤器放置在嵌套的member对象数组上

var filter = Builders<MemberCollection>.Filter.Eq("Members.EmailAddress", emailAddress);

等效的MongoDB查询将是

db.Getcollection('Members').Find({"Members.EmailAddress": "test@msn.com"})

编辑:

不知道你的结局有什么问题,但试试如下

var collection = _mongoclientProvider.GetDatabase.GetCollection<MemberCollection>("Members");
Expression<Func<MemberCollection, bool>> expression = mc => mc.Members.Any(m => m.EmailAddress == emailAddress);
var list = collection.Find(expression).ToList();

您正在错误地使用Builders<CarCollection>.Filter.Eq()

var numberOfDoors = 3;

var collection = ..GetCollection<CarCollection>("Cars");

var builder = Builders<CarCollection>.Filter;
var filt = builder.Where(car => car.NumberOfDoors == numberOfDoors);
var list = await collection.Find(filt).ToListAsync();

这假定:

public class CarCollection : IEnumerable<Car> { ... }

public class Car { public int NumberOfDoors { get; set; } ... }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM