Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用;“聚合”;加上;项目“;在C#中的MongoDB查询中?_C#_Mongodb_.net Core_Mongodb .net Driver - Fatal编程技术网

如何使用;“聚合”;加上;项目“;在C#中的MongoDB查询中?

如何使用;“聚合”;加上;项目“;在C#中的MongoDB查询中?,c#,mongodb,.net-core,mongodb-.net-driver,C#,Mongodb,.net Core,Mongodb .net Driver,环境: MongoDB.驱动程序(2.8.1) Microsoft.NETCore.App(3.0.0-preview7-27912-14) 语言:C# 我在MongoDB中的一个名为“Revendas”的集合中有以下存储结构: 我希望搜索客户端令牌集合,并仅返回回答查询的客户端。 我可以直接在mongodb中执行查询: db.Revendas.aggregate([ { $unwind :'$Clientes'}, { $match : {'Clientes.Tokens.To

环境:

MongoDB.驱动程序(2.8.1)

Microsoft.NETCore.App(3.0.0-preview7-27912-14)

语言:C#

我在MongoDB中的一个名为“Revendas”的集合中有以下存储结构:

我希望搜索客户端令牌集合,并仅返回回答查询的客户端。 我可以直接在mongodb中执行查询:

db.Revendas.aggregate([
    { $unwind :'$Clientes'},
    { $match : {'Clientes.Tokens.Token': '671bcaf806405e5d55419746a1b320cc729558fb' }},
    { 
        $project : {
            Codigo: "$Clientes.Codigo", 
            Nome : '$Clientes.Nome', 
            CNPJ : '$Clientes.CNPJ',
            CPF: '$Clientes.CPF',
            Tokens : '$Clientes.Tokens'       
        } 
    }
])
上一个查询返回我需要的数据:

{
    "_id" : ObjectId("5cd0825f92225e4f1179f3b8"),
    "Codigo" : "2",
    "Nome" : "Segundo cliente da revenda 5cd0825f92225e4f1179f3b8",
    "CNPJ" : "string",
    "CPF" : "string",
    "Tokens" : [ 
        {
            "Token" : "671bcaf806405e5d55419746a1b320cc729558fb",
            "Geracao" : ISODate("2019-05-06T09:29:07.928-03:00"),
            "Revogacao" : ISODate("2022-05-06T09:29:07.928-03:00")
        }
    ]
}
问题是,如何将此查询转换为C#mongodb驱动程序

我的尝试是:

string tokenpesquisa = "";

var agg = Database.GetCollection<RevendaCliente>("{'Clientes.Tokens.Token': '" + tokenpesquisa + "'}").Aggregate();

var project = agg.Project(o => new {
    Codigo = o.Codigo,
    Nome = o.Nome,
    CNPJ = o.CNPJ,
    CPF = o.CPF,
    Tokens = o.Tokens
});

var result = project.ToListAsync().Result;
字符串tokenpesquisa=”“;
var agg=Database.GetCollection(“{'Clientes.Tokens.Tokens':'”+tokenpesquisa+“}”).Aggregate();
var project=agg.project(o=>new{
Codigo=o.Codigo,
诺姆=o.诺姆,
CNPJ=o.CNPJ,
CPF=o.CPF,
代币=o.代币
});
var result=project.ToListAsync().result;
但是数据没有按预期返回


以下是user@mickl建议的解决我的问题的代码片段:

CollRevendas = Database.GetCollection<Revenda>("Revendas");

var query = CollRevendas.Aggregate()
 .Unwind("Clientes")
 .Match(new BsonDocument() { { "Clientes.Tokens.Token", "" + tokenpesquisa + "" } })
 .Project<RevendaCliente>(new BsonDocument()
     {
        { "_id", 0 },
        { "Codigo", "$Clientes.Codigo" },
        { "Nome", "$Clientes.Nome" },
        { "CNPJ", "$Clientes.CNPJ" },
        { "CPF", "$Clientes.CPF" },
        { "Tokens", "$Clientes.Tokens" }
     });

var doc = query.First();

return doc;
CollRevendas=Database.GetCollection(“Revendas”);
var query=CollRevendas.Aggregate()
.放松(“客户”)
.Match(新的BsonDocument(){{“Clientes.Tokens.Token”,“+tokenpesquisa+”})
.项目(新的B文件()
{
{u id',0},
{“Codigo”,“$Clientes.Codigo”},
{“Nome”,“$Clientes.Nome”},
{“CNPJ”,“$Clientes.CNPJ”},
{“CPF”,“$Clientes.CPF”},
{“Tokens”,“$Clientes.Tokens”}
});
var doc=query.First();
退货单;

通用方法
GetCollection
将集合名称作为第一个参数。这里最简单的方法是对表示MongoDB文档的
BsonDocument
类型进行操作,该类型稍后可以反序列化为您的类型:

var col = database.GetCollection<BsonDocument>("Revendas");

var query =  col.Aggregate()
                .Unwind("Clientes")
                .Match(new BsonDocument(){ { "Clientes.Tokens.Token", "671bcaf806405e5d55419746a1b320cc729558fb" } })
                .Project(new BsonDocument()
                    {
                        { "Codigo", "$Clientes.Codigo" },
                        { "Nome", "$Clientes.Nome" },
                        { "CNPJ", "$Clientes.CNPJ" },
                        { "CPF", "$Clientes.CPF" },
                        { "Tokens", "$Clientes.Tokens" }
                    });

var doc = query.First();
并运行
项目的通用版本

.Project<Model>(new BsonDocument()
    {
        { "Codigo", "$Clientes.Codigo" },
        { "Nome", "$Clientes.Nome" },
        { "CNPJ", "$Clientes.CNPJ" },
        { "CPF", "$Clientes.CPF" },
        { "Tokens", "$Clientes.Tokens" }
    });
.Project(新的BsonDocument()
{
{“Codigo”,“$Clientes.Codigo”},
{“Nome”,“$Clientes.Nome”},
{“CNPJ”,“$Clientes.CNPJ”},
{“CPF”,“$Clientes.CPF”},
{“Tokens”,“$Clientes.Tokens”}
});

!他的回答是正确的。老兄,我连感谢的话都没有,非常感谢。正如您所建议的,编写查询最酷的一点是,我们可以看到在执行查询之前组装的查询。我编辑了我的问题,包括解决我的问题的代码片段。
public class Model
{
    public ObjectId Id { get; set; }
    public string Codigo { get; set; }
    public string Nome { get; set; }
    public string CNPJ { get; set; }
    public string CPF { get; set; }
    public TokenModel[] Tokens { get; set; }
}

public class TokenModel
{
    public string Token { get; set; }
    public DateTime Geracao { get; set; }
    public DateTime Revogacao { get; set; }
}
.Project<Model>(new BsonDocument()
    {
        { "Codigo", "$Clientes.Codigo" },
        { "Nome", "$Clientes.Nome" },
        { "CNPJ", "$Clientes.CNPJ" },
        { "CPF", "$Clientes.CPF" },
        { "Tokens", "$Clientes.Tokens" }
    });