使用C#查询MongoDB嵌套数组文档

5

我正在使用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查询都有字段名。在上面的情况下,Contact字段的最内层数组没有任何显式的字段名。到目前为止,我已经尝试了所有以下C#代码来实现这种情况,但是没有一个能够帮助。

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)))));

非常感谢您的帮助。


SO不是代码转换服务。请查阅Mongo C#驱动程序文档并自行操作。 - Matías Fidemraizer
@Matias,感谢您的回复。我已经阅读了Mongo C#驱动程序文档,但在我的MongoDB查询中,我想要实现$elematch而不指定最内层数组的字段名。我正在努力在C#中实现相同的功能,但它要求每个ElemMatch查询都需要字段名。因此,在SO上寻求帮助。 - Aarthi Priyadharshini
我认为你应该在问题正文中解释你的问题,而不是在评论中。你当前的文本只是“请将我的代码翻译成C#” :( - Matías Fidemraizer
2个回答

2

经过一周的努力,找到了一种方法。实现上述MongoDB查询的最佳方法是将其反序列化为BsonDocument,然后将其作为过滤器传递给FindAsync。

var bQuery = "{'Customers.Contact':{$elemMatch:{$elemMatch:{LastName: /.*Dev.*/}}}}";
var filter = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>(bQuery);
var result = collection.FindSync(filter).ToList();

感谢Saleem先生。请参考以下链接了解更多详情。 如何在C#中实现MongoDB嵌套的$elemMatch查询

1

我不了解你的上下文 - 所以这只是帮助你的尝试。 请注意,contact是一个列表而不是数组 这将帮助您构建自己的筛选表达式。

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; }
    }
}

谢谢教授。非常有帮助。但在我的情况下,上面的代码由于JSON格式中的数组列表而无法工作,例如:联系人:[[{}],[{}]]。 - Aarthi Priyadharshini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接