如何使用;“聚合”;加上;项目“;在C#中的MongoDB查询中?
环境: MongoDB.驱动程序(2.8.1) Microsoft.NETCore.App(3.0.0-preview7-27912-14) 语言:C# 我在MongoDB中的一个名为“Revendas”的集合中有以下存储结构: 我希望搜索客户端令牌集合,并仅返回回答查询的客户端。 我可以直接在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
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" }
});