使用 C# 查询 MongoDB 个嵌套数组文档
Querying MongoDB nested array documents using C#
我正在尝试使用 C# 在 MongoDB 中使用嵌套数组文档实现文本搜索功能。我有一个以下格式的 MongoDB 集合。
{
"_id" : ObjectId("56c6f03ffd07dc1de805e84f"),
"Customers" : {
"Contact" : [
[
{
"FirstName" : "Swetha",
"LastName" : "DevAnand"
}
]
]
}
}
Mongo 查询:
db.test_collection.find({"Customers.Contact":{$elemMatch:{$elemMatch:{LastName: /.*Dev.*/}}}});
如上面的MongoDB 查询,我想使用C# 对最内层的BSON 文档数组进行LIKE 搜索。但是,我在 Mongo 查询中使用嵌套的 $elemMatch 实现了这一点。但是在 C# 中尝试做同样的事情时,它期望每个 ElemMatch Query.In 的字段名在上述情况下,联系人字段的最内层数组没有任何显式字段名。到目前为止,我已经尝试了以下所有 C# 代码来实现该场景,但是 none 有帮助。
var regex = new BsonRegularExpression(searchVal,"i");
query = Query.And(Query.ElemMatch("Customers.Contact", Query.And(Query.ElemMatch("LastName", Query.Matches("LastName", regex)))));
query = Query.And(Query.Matches("Customers.Contact.$.LastName",regex));
query = Query.And(Query.ElemMatch("Customers.Contact.$", Query.EQ("LastName", regex)));
query = Query.And(Query.ElemMatch("Customers.Contact.$", Query.Matches("LastName", regex)));
query = Query.And(Query.ElemMatch("Customers.Contact", Query.And(Query.ElemMatch("$", Query.EQ("LastName", regex)))));
非常感谢任何帮助。
我不了解你的背景 - 所以得到这个来尝试帮助你。
请注意,联系人是列表而不是数组
这将帮助您构建自己的过滤器表达式
namespace ClassLibrary1
{
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using MongoDB.Driver;
/// <summary>
/// The class 1.
/// </summary>
public class Class1
{
/// <summary>
/// The get data.
/// </summary>
public async void GetData()
{
var context = new Context();
var searchString = "1234";
Expression<Func<SomeThing, bool>> filter = x =>
x.Contact.Exists(s => s.FirstName == searchString
&& x.Contact.Exists(l=>l.LastName == searchString));
var result = await context.SomeThingCollection.FindAsync(filter);
}
}
/// <summary>
/// The context.
/// </summary>
public class Context
{
public const string CONNECTION_STRING_NAME = " ";
public const string DATABASE_NAME = " ";
public const string COLLECTION_NAME = "name";
private static readonly IMongoClient _client;
private static readonly IMongoDatabase _database;
static Context()
{
var connectionString = "connectionString";
_client = new MongoClient(connectionString);
_database = _client.GetDatabase(DATABASE_NAME);
}
public IMongoCollection<SomeThing> SomeThingCollection
{
get
{
return _database.GetCollection<SomeThing>(COLLECTION_NAME);
}
}
}
public class SomeThing
{
public List<Contact> Contact { get; set; }
}
public class Contact
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
}
经过一周的奋斗,找到了方法。实现上述 MongoDB 查询的最佳方法是将其反序列化为 BsonDocument,在 return 中将作为过滤器传递给 FindAsync。
var bQuery = "{'Customers.Contact':{$elemMatch:{$elemMatch:{LastName: /.*Dev.*/}}}}";
var filter = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>(bQuery);
var result = collection.FindSync(filter).ToList();
感谢Mr.Saleem。详情请参考下方link。
我正在尝试使用 C# 在 MongoDB 中使用嵌套数组文档实现文本搜索功能。我有一个以下格式的 MongoDB 集合。
{
"_id" : ObjectId("56c6f03ffd07dc1de805e84f"),
"Customers" : {
"Contact" : [
[
{
"FirstName" : "Swetha",
"LastName" : "DevAnand"
}
]
]
}
}
Mongo 查询:
db.test_collection.find({"Customers.Contact":{$elemMatch:{$elemMatch:{LastName: /.*Dev.*/}}}});
如上面的MongoDB 查询,我想使用C# 对最内层的BSON 文档数组进行LIKE 搜索。但是,我在 Mongo 查询中使用嵌套的 $elemMatch 实现了这一点。但是在 C# 中尝试做同样的事情时,它期望每个 ElemMatch Query.In 的字段名在上述情况下,联系人字段的最内层数组没有任何显式字段名。到目前为止,我已经尝试了以下所有 C# 代码来实现该场景,但是 none 有帮助。
var regex = new BsonRegularExpression(searchVal,"i");
query = Query.And(Query.ElemMatch("Customers.Contact", Query.And(Query.ElemMatch("LastName", Query.Matches("LastName", regex)))));
query = Query.And(Query.Matches("Customers.Contact.$.LastName",regex));
query = Query.And(Query.ElemMatch("Customers.Contact.$", Query.EQ("LastName", regex)));
query = Query.And(Query.ElemMatch("Customers.Contact.$", Query.Matches("LastName", regex)));
query = Query.And(Query.ElemMatch("Customers.Contact", Query.And(Query.ElemMatch("$", Query.EQ("LastName", regex)))));
非常感谢任何帮助。
我不了解你的背景 - 所以得到这个来尝试帮助你。 请注意,联系人是列表而不是数组 这将帮助您构建自己的过滤器表达式
namespace ClassLibrary1
{
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using MongoDB.Driver;
/// <summary>
/// The class 1.
/// </summary>
public class Class1
{
/// <summary>
/// The get data.
/// </summary>
public async void GetData()
{
var context = new Context();
var searchString = "1234";
Expression<Func<SomeThing, bool>> filter = x =>
x.Contact.Exists(s => s.FirstName == searchString
&& x.Contact.Exists(l=>l.LastName == searchString));
var result = await context.SomeThingCollection.FindAsync(filter);
}
}
/// <summary>
/// The context.
/// </summary>
public class Context
{
public const string CONNECTION_STRING_NAME = " ";
public const string DATABASE_NAME = " ";
public const string COLLECTION_NAME = "name";
private static readonly IMongoClient _client;
private static readonly IMongoDatabase _database;
static Context()
{
var connectionString = "connectionString";
_client = new MongoClient(connectionString);
_database = _client.GetDatabase(DATABASE_NAME);
}
public IMongoCollection<SomeThing> SomeThingCollection
{
get
{
return _database.GetCollection<SomeThing>(COLLECTION_NAME);
}
}
}
public class SomeThing
{
public List<Contact> Contact { get; set; }
}
public class Contact
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
}
经过一周的奋斗,找到了方法。实现上述 MongoDB 查询的最佳方法是将其反序列化为 BsonDocument,在 return 中将作为过滤器传递给 FindAsync。
var bQuery = "{'Customers.Contact':{$elemMatch:{$elemMatch:{LastName: /.*Dev.*/}}}}";
var filter = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>(bQuery);
var result = collection.FindSync(filter).ToList();
感谢Mr.Saleem。详情请参考下方link。