使用Elemmatch查询MondoDB-使用C#驱动程序

问题描述 投票:1回答:1

我在将查询(相对简单)从Mongo Shell转换为C#时遇到麻烦(可以是linq或filter builder)。我想按某个字段(在我的示例EntityIdActivityDate中)和数组上存在的字段(在我的示例UnCommonFields中)进行查询。

数据示例:

{ 
    "_id" : ObjectId("5ded105e90424e1c0e6fda05"), 
    "EntryId" : NumberLong(1111111), 
    "EntityId" : "10000007", 
    "EntityType" : NumberInt(5), 
    "ActivityItemId" : "1,4,16172532", 
    "ActivityDate" : ISODate("2015-04-13T03:50:55.000-0400"), 
    "CreateDate" : ISODate("2017-12-13T19:07:07.757-0500"), 
    "UpdateDate" : ISODate("2017-12-13T19:07:07.757-0500"), 
    "ActivityItemStatus" : NumberInt(2), 
    "ActivityTypeId" : NumberInt(2), 
    "Currency" : "USD", 
    "Amount" : "-10.7800", 
    "ActivityItemDescription" : "Stackoverflow example", 
    "DisplayLevel" : NumberInt(10), 
    "UnCommonFields" : [   
        {
            "k" : "CardPresent", 
            "v" : NumberLong(2)
        }, 
        {
            "k" : "PreAuthDate", 
            "v" : ISODate("2015-04-11T08:47:05.000-0400")
        }, 
        {
            "k" : "TransactionDate", 
            "v" : ISODate("2015-04-13T03:50:55.000-0400")
        }, 
        {
            "k" : "ActivityItemStatus", 
            "v" : NumberLong(2)
        }, 
        {
            "k" : "MerchantName", 
            "v" : "StackOverflow POS"
        }, 
        {
            "k" : "TerminalCity", 
            "v" : "TLV"
        }, 
        {
            "k" : "TerminalState", 
            "v" : "IL"
        }, 
        {
            "k" : "TerminalCountry", 
            "v" : "IL"
        }, 
        {
            "k" : "Fee", 
            "v" : 0.0
        }, 
        {
            "k" : "IsDecline", 
            "v" : false
        }, 
        {
            "k" : "BillingAmount", 
            "v" : -10.78
        }, 
        {
            "k" : "BillingCurrency", 
            "v" : "USD"
        }, 
        {
            "k" : "ForeignAmount", 
            "v" : -10.78
        }, 
        {
            "k" : "ForeignCurrency", 
            "v" : "USD"
        }, 
        {
            "k" : "FxRate", 
            "v" : 1.0
        }, 
        {
            "k" : "MaskedCardNumber", 
            "v" : "530000XXXXXX6699"
        }
    ]
}

我要编写的查询在Mongo Shell上看起来像这样:

db.getCollection("ActivityWriterTest").find(     
   {$and: 
      [ 
        {EntityId:"10000007"}, 
        { ActivityDate: { $gte: ISODate("2015-04-12T03:50:55.000"), $lte: ISODate("2015-04-14T03:50:55.000") } },
        {UnCommonFields : { $elemMatch : {"k" : "ForeignAmount", "v" : {$in: [-10.78, -15.85] } }}}
      ]
   })

这是我在C#代码上写的部分:它包含两个第一个过滤器,并且可以按预期工作

_activityContext.ActivityData.Find(x => x.EntityId == accountHolderId && x.ActivityDate >= requestDetails.FromDate && x.ActivityDate <= requestDetails.ToDate)

我尝试以多种方式实现电子营销,但没有成功。有什么想法可以翻译和整合elemmatch作为查询的一部分吗?

我使用MongoDB驱动程序2.10

c# mongodb mongodb-query mongodb-.net-driver
1个回答
0
投票

您尚未显示C#类的外观,但我假设您正在将System.Object用作UnCommonFields.v,因为那里有不同类型的值。

要构建$elemMatch查询,您需要使用MongDB C#驱动程序中的Builders<T>.Filter类型。假设Model代表您的实体,Uncommonfield代表嵌套的对象,则可以在查询下面运行:

var query = Builders<Model>.Filter.And(
                Builders<Model>.Filter.Eq(x => x.EntityId, accountHolderId),
                Builders<Model>.Filter.Gte(x => x.ActivityDate, requestDetails.FromDate),
                Builders<Model>.Filter.Lte(x => x.ActivityDate, requestDetails.ToDate),
                Builders<Model>.Filter.ElemMatch(x => x.UnCommonFields, 
                    Builders<Uncommonfield>.Filter.And(
                        Builders<Uncommonfield>.Filter.Eq(x => x.k, "ForeignAmount"),
                        Builders<Uncommonfield>.Filter.In(f => f.v, new object[]{ -10.78, -15.85 })
                    )
                )
            );

var doc = _mongoDBCollection.Find(query).First();
© www.soinside.com 2019 - 2024. All rights reserved.