首页 > 解决方案 > MongoDb:使用 $divide 和 $gte 的问题

问题描述

我是 MongoDb 的新手。我有问题当我使用$divide$gte下面的代码时不要给我错误。但它的过滤器不起作用。

代码 :

var filter1 = new BsonDocument()
              { 
                {"expr",
                        new BsonDocument(){
                        {
                            "$gte", new BsonArray{
                                new BsonDocument{
                                {
                                    "$divide", new BsonArray{"$nA", "$wT"}
                                },
                            },
                            sPacketMSItem.FromDPC.Value
                        }
                      }
                    }
                   }
                 };

如果有人要求比告诉我更多的信息。

例外 :

{MongoDB.Driver.MongoCommandException:命令查找失败:未知顶级运算符:$expr。在 MongoDB.Driver.Core.WireProtocol.CommandWireProtocol 1.ProcessReply(ConnectionId connectionId, ReplyMessage1 回复) 在 MongoDB.Driver.Core.WireProtocol.CommandWireProtocol 1.ExecuteAsync(IConnection connection, CancellationToken cancellationToken) at MongoDB.Driver.Core.Servers.Server.ServerChannel.ExecuteProtocolAsync[TResult](IWireProtocol1 协议,CancellationToken cancelToken) 在 MongoDB.Driver.Core.Operations.CommandOperationBase 1.ExecuteProtocolAsync(IChannelSource channelSource, ICoreSessionHandle session, ReadPreference readPreference, CancellationToken cancellationToken) at MongoDB.Driver.Core.Operations.ReadCommandOperation1.ExecuteAsync(IReadBinding binding, CancellationToken cancelToken) 在MongoDB.Driver.Core.Operations.FindCommandOperation 1.ExecuteAsync(IReadBinding binding, CancellationToken cancellationToken) at MongoDB.Driver.Core.Operations.FindOperation1.ExecuteAsync(IReadBinding binding, CancellationToken cancelToken) at MongoDB.Driver.OperationExecutor.ExecuteReadOperationAsync[TResult](IReadBinding binding, IReadOperation 1 operation, CancellationToken cancellationToken) at MongoDB.Driver.MongoCollectionImpl1.ExecuteReadOperationAsync[TResult](IClientSessionHandle session, IReadOperation1 operation, ReadPreference readPreference, CancellationToken cancellationToken) at MongoDB.Driver.MongoCollectionImpl1.在 /Users/lalitdevani/Documents/AasthaSalesWebApi/Aastha/_git/Sales.WebApi/ 中的 Biz.DAL.MongoRepositoriesCustom.SalesCRMRepository.MarketSheet.MarketSheetRepository.SearchBySearchPacketMSItemAsync(SearchPacketMSItem sPacketMSItem) 使用ImplicitSessionAsync[TResult](Func 2 funcAsync, CancellationToken cancellationToken) at MongoDB.Driver.IAsyncCursorSourceExtensions.ToListAsync[TDocument](IAsyncCursorSource1 source, CancellationToken cancelToken) Biz.DAL/MongoRepositoriesCustom/SalesCRMRepository/MarketSheet/MarketSheetRepository.cs:line 142}

任何帮助将不胜感激。

标签: c#mongodbfilter

解决方案


$expr是一个评估查询运算符,所以它应该以美元符号为前缀,试试:

var filter1 = new BsonDocument()
            { 
                {"$expr",
                        new BsonDocument(){
                        {
                            "$gte", new BsonArray{
                                new BsonDocument{
                                {
                                    "$divide", new BsonArray{"$nA", "$wT"}
                                },
                            },
                            sPacketMSItem.FromDPC.Value
                        }
                    }
                    }
                }
            };

编辑:$expr在 MongoDB 3.6 或更高版本中可用,作为后备,您可以使用$redact,尝试:

var redact = new BsonDocument()
        {
        {"$redact",
                new BsonDocument
                {
                    {
                        "$cond", new BsonDocument(){
                        {
                            "if", new BsonDocument()
                            {
                                { "$gte", new BsonArray
                                    {
                                        new BsonDocument{
                                        {
                                            "$divide", new BsonArray{"$nA", "$wT"}
                                        },
                                    },
                                    sPacketMSItem.FromDPC.Value
                                    }
                                }
                            }
                        },
                        {  "then", "$$KEEP"  },
                        {  "else", "$$PRUNE" }
                    }
                    }
                }
        }
    };

var result = Col.Aggregate()
                .AppendStage<BsonDocument>(redact).ToList();

推荐阅读