簡體   English   中英

使用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 Search。 但是,我在Mongo Query中使用嵌套的$ elemMatch實現了這一點。 但是在嘗試在C#中執行相同操作時,它需要每個ElemMatch Query的字段名。在上述情況下,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)))));

任何幫助都非常感謝。

經過一周的奮斗,找到了一條路。 實現上述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();

感謝Mr.Saleem。 有關詳細信息,請參閱以下鏈接。 如何在C#中實現MongoDB嵌套$ elemMatch查詢

我不了解您的背景 - 所以請盡量幫助您。 請注意,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; }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM