如何通过 .net mongoDb 驱动程序通过嵌套 属性 获取 mongoDb 中的文档
How to get a document in mongoDb via a nested property through .net mongoDb driver
假设我在某个集合中有以下文档
[{
"name": "Man1",
"Childrens": [
{
"name": "Children 1",
"age": "12"
},
{
"name": "Children 2",
"age": "18"
},
]
},
{
"name": "Man1",
"Childrens": [
{
"name": "Children 3",
"age": "12"
},
{
"name": "Children 4",
"age": "18"
},
]
}
]
我想获取 children 之一的名称为 "Children 1"
的文档
我想通过 .net mongo 驱动程序
实现
var bQuery = String.Format("{{ '{0}':'{1}' }}","Childrens.name","Children 1");
var filter = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>(bQuery);
result = await db.GetCollection<T>(collectionName).Find<T>(filter).ToListAsync();
但是这个 return 空列表
就像我做的那样
var bQuery = String.Format("{{ '{0}':'{1}' }}","name","Man1");
有效
所以当我们通过嵌套 属性
搜索时我无法让它工作
请尝试使用下面的代码,我已经测试成功:
{ "Childrens": { $elemMatch: { "name": "Children 1"} } }
您的代码将是:
var filter = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>("{ \"Childrens\": { $elemMatch: { \"name\": \"Children 1\"} } }");
result = await db.GetCollection<T>(collectionName).Find<T>(filter).ToListAsync();
假设我在某个集合中有以下文档
[{
"name": "Man1",
"Childrens": [
{
"name": "Children 1",
"age": "12"
},
{
"name": "Children 2",
"age": "18"
},
]
},
{
"name": "Man1",
"Childrens": [
{
"name": "Children 3",
"age": "12"
},
{
"name": "Children 4",
"age": "18"
},
]
}
]
我想获取 children 之一的名称为 "Children 1"
的文档我想通过 .net mongo 驱动程序
实现var bQuery = String.Format("{{ '{0}':'{1}' }}","Childrens.name","Children 1");
var filter = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>(bQuery);
result = await db.GetCollection<T>(collectionName).Find<T>(filter).ToListAsync();
但是这个 return 空列表 就像我做的那样
var bQuery = String.Format("{{ '{0}':'{1}' }}","name","Man1");
有效
所以当我们通过嵌套 属性
搜索时我无法让它工作请尝试使用下面的代码,我已经测试成功:
{ "Childrens": { $elemMatch: { "name": "Children 1"} } }
您的代码将是:
var filter = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>("{ \"Childrens\": { $elemMatch: { \"name\": \"Children 1\"} } }");
result = await db.GetCollection<T>(collectionName).Find<T>(filter).ToListAsync();