2 votes

Comment filtrer les documents en utilisant l'horodatage dans ObjectId en C# ?

Je construis une application qui nécessite un transfert de données depuis des documents MongoDB vers une table SQL Server. Je crée un fichier JSON pour y exporter les documents MongoDB (dont le code est joint à la présente). Comment puis-je maintenant ajouter un filtre pour que seuls les documents créés dans la collection MongoDB après une donnée spécifique soient exportés vers le fichier JSON ?

Je pense que cela peut être réalisé en utilisant d'une manière ou d'une autre l'horodatage dans le champ ObjectId d'un document MongoDB, mais je n'ai pas trouvé comment.

using (FileStream fs = File.Create(path))
{
    using (var fw = new StreamWriter(fs))
    {
        fw.Write("[");
            using (var cursor = await collection.Find(new BsonDocument()).Project(Builders<BsonDocument>.Projection.Exclude("_id")).ToCursorAsync())
            {
            while (await cursor.MoveNextAsync())

                foreach (var doc in cursor.Current)
                {
                    fw.Write(doc.ToString());
                    fw.Write(",");
                }
                fw.Flush();
        }
        fs.SetLength(fs.Length - 1);
        fw.Write("]");
    }
}

4voto

Greg Stanley Points 288

Je ne peux pas utiliser votre exemple exact mais j'ai réussi à créer quelque chose de similaire qui filtre en utilisant l'ObjectId datetime :

// Declare a date range - presumably these would be dynamic not fixed strings
var startDateTime = DateTime.Parse("2018-09-13 14:19:26.000Z");
var endDateTime = DateTime.Parse("2018-09-24 14:03:38.000Z");

// Use the dates to create ObjectId type for comparison
var startId = new ObjectId(startDateTime, 0, 0, 0);
var endId = new ObjectId(endDateTime, 0, 0, 0);

// Use the ObjectId types in the filter
using (var cursor = await collection.Find(x => x._id > startId && x._id < endId).ToCursorAsync())
{
    while (await cursor.MoveNextAsync())
    {
        foreach (var doc in cursor.Current)
        {
            // Use doc object
        }
     }
 }

Note : J'ai utilisé la dernière version du paquet MongoDB.Driver.

1voto

Darsh Khetan Points 43

Dans l'extrait de code ci-dessus, un fichier JSON est construit à l'aide de StreamWriter, alors que l'objectif peut être résolu en utilisant le processus mongoexport.exe via un code d'application C#, ce qui facilite également le filtrage :

public static string dateConverter(DateTime dt)
    {
        long decimalNumber = (long)(dt.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
        return (Convert.ToString(decimalNumber, 16));
    }
public static void Main(string[] args)
    {
        try
        {
            CultureInfo provider = CultureInfo.InvariantCulture;
            string instr;
            Console.WriteLine("Enter the start date");
            instr = Console.ReadLine();
            DateTime.TryParseExact(instr, "yyyy/MM/dd", provider, DateTimeStyles.None, out startDate);
            Console.WriteLine("Enter the end date");
            instr = Console.ReadLine();
            DateTime.TryParseExact(instr, "yyyy/MM/dd", provider, DateTimeStyles.None, out endDate);
            queryFilter = "{_id:{$gte: ObjectId('" + dateConverter(startDate) + "0000000000000000'), $lte: ObjectId('" + dateConverter(endDate) + "ffffffffffffffff')}}";
            string expstring = " --db yourDatabaseName --collection yourCollectionName --type json --query " + queryFilter + " --out yourFilePath --jsonArray";
            Process export = new Process();
            export.StartInfo.FileName = ExportEXEPath;
            export.StartInfo.Arguments = expstring;
            export.Start();
        }
        catch (Exception ex)
        {
            Console.WriteLine("[ERROR]: " + ex.Message);
        }
    }

Cependant, il y a un problème avec le passage d'un argument dans la ligne de commande en utilisant une chaîne qui contient des guillemets (") à l'intérieur d'elle-même (comme cela a été fait après le mot-clé --query), une discussion à ce sujet peut être référée en cliquant sur aquí .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X