You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# MongoDB驱动日期范围查询求助:按ssimBeg筛选获取ssimDsc

Hey there! Since you're new to the C# MongoDB driver, let's break down how to solve this date range query problem step by step. Your goal is to fetch the ssimDsc field for all entries where ssimBeg is on or after a specified date (like "03MAR18"), so we have two solid approaches depending on your needs:

Option 1: Simple String Comparison (Fast, Format-Dependent)

Your ssimBeg values follow a consistent ddMMMyy format (e.g., "05JAN18", "07JUN18") with uppercase month abbreviations. This format can be directly compared as strings because the dictionary order matches chronological order (e.g., "05JAN18" < "03MAR18", "07JUN18" > "03MAR18").

First, define a model class to map your collection data (you can skip this if you prefer working with BsonDocument directly):

public class SsimEntry
{
    public string ssimBeg { get; set; }
    public string ssimDsc { get; set; }
    // Add other fields as needed
}

Then write the query code:

using MongoDB.Driver;
using System;

// Initialize MongoDB client and collection
var client = new MongoClient("mongodb://your-connection-string");
var db = client.GetDatabase("your-database-name");
var collection = db.GetCollection<SsimEntry>("your-collection-name");

// Your target input date (must match the ddMMMyy format)
string targetDate = "03MAR18";

// Filter entries where ssimBeg is >= target date
var filter = Builders<SsimEntry>.Filter.Gte(x => x.ssimBeg, targetDate);

// Project only the ssimDsc field (exclude _id to clean up results)
var projection = Builders<SsimEntry>.Projection
    .Include(x => x.ssimDsc)
    .Exclude(x => x.Id);

// Execute the query and get results
var matchingEntries = collection.Find(filter).Project(projection).ToList();

// Output the results
foreach (var entry in matchingEntries)
{
    Console.WriteLine(entry.ssimDsc);
}

Option 2: Convert to DateTime (Robust, Flexible)

If you want to avoid relying on string format consistency (e.g., potential lowercase months, future date format changes), converting ssimBeg to a proper DateTime type for comparison is the way to go. This works better for complex date logic too.

This approach converts the string date in MongoDB before filtering, which is efficient and handles format variations:

using MongoDB.Driver;
using System;
using System.Globalization;

var client = new MongoClient("mongodb://your-connection-string");
var db = client.GetDatabase("your-database-name");
var collection = db.GetCollection<BsonDocument>("your-collection-name");

// Parse your target date to a DateTime object
var targetDateTime = DateTime.ParseExact("03MAR18", "ddMMMyy", CultureInfo.InvariantCulture);

// Build the aggregation pipeline
var pipeline = new BsonDocument[]
{
    // Add a new field with the converted DateTime value
    new BsonDocument("$addFields", new BsonDocument(
        "ssimBegDate", new BsonDocument("$dateFromString", new BsonDocument
        {
            { "dateString", "$ssimBeg" },
            { "format", "%d%b%y" }, // MongoDB format code for ddMMMyy
            { "timezone", "UTC" } // Adjust timezone as needed
        })
    )),
    // Filter entries where the converted date is >= target
    new BsonDocument("$match", new BsonDocument(
        "ssimBegDate", new BsonDocument("$gte", targetDateTime)
    )),
    // Keep only the ssimDsc field
    new BsonDocument("$project", new BsonDocument
    {
        { "ssimDsc", 1 },
        { "_id", 0 }
    })
};

// Run the aggregation
var results = collection.Aggregate<BsonDocument>(pipeline).ToList();

// Print the results
foreach (var doc in results)
{
    Console.WriteLine(doc["ssimDsc"].AsString);
}

Alternative: Inline DateTime Conversion in Filter

If you're using a newer MongoDB driver version, you can convert the date directly in the filter (note: this may be less efficient than the aggregation pipeline for large collections):

using MongoDB.Driver;
using System;
using System.Globalization;

var client = new MongoClient("mongodb://your-connection-string");
var db = client.GetDatabase("your-database-name");
var collection = db.GetCollection<SsimEntry>("your-collection-name");

var targetDateTime = DateTime.ParseExact("03MAR18", "ddMMMyy", CultureInfo.InvariantCulture);

// Filter using inline DateTime conversion
var filter = Builders<SsimEntry>.Filter.Gte(
    Builders<SsimEntry>.Expression(x => DateTime.ParseExact(x.ssimBeg, "ddMMMyy", CultureInfo.InvariantCulture)),
    targetDateTime
);

var projection = Builders<SsimEntry>.Projection.Include(x => x.ssimDsc).Exclude(x => x.Id);

var matchingEntries = collection.Find(filter).Project(projection).ToList();

Key Notes:

  • Option 1 is great if you're confident your ssimBeg format will never change and is always consistent.
  • Option 2 is more future-proof and handles edge cases (like invalid date strings, timezone adjustments) better.

内容的提问来源于stack exchange,提问作者Rajiv Krishnaa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:39:11