Применив фильтр к внедренному документу, отфильтруйте отдельные значения - PullRequest
0 голосов
/ 08 февраля 2019

Итак, я создал свой фильтр для документа и вложенного документа, а затем передал этот фильтр в отдельный запрос.Я хочу использовать этот запрос в моем курсоре, но я получаю сообщение об ошибке, FindAsync не может быть выведено из использования.Попробуйте указать аргументы типа явно.

Я очень новичок в Mongodb ... любая помощь будет фантастической.Это работает, если я просто пропущу фильтр, но мне нужны только отдельные документы.

       var builder = Builders<newMsg>.Filter;
       var filter = builder.Eq("type", "CREATE") & builder.Eq("entities.errorCondition", 14);
    // var result = collection.Find(filter).ToList();
        IList<newMsg> distinct = collection.Distinct<newMsg>("entities.ID", filter).ToList<newMsg>();

        if (distinct.Count > 0)
        {
            using (IAsyncCursor<newMsg> cursor = await collection.FindAsync(distinct))
            {
                while (await cursor.MoveNextAsync())
                {
                    IEnumerable<newMsg> batch = cursor.Current;
                    foreach (newMsg document in batch)
                    {
                        //This gives me the entire list as a string
                        var subDocument = document.Entities;
                        foreach (var sd in subDocument)
                        {
                          //do some stuff

                        }
                    }
                }
            }
        }
    }

мои файлы классов выглядят так

    [BsonIgnoreExtraElements]
    internal class newMsg
    {
        [BsonId]
        public ObjectId _id { get; set; }

        [BsonElement("type")]
        public string Type { get; set; }

        [BsonElement("entities")]
        public List<entity> Entities { get; set; }
    }
    [BsonIgnoreExtraElements]
    internal class entity : newMsg
    {
        [BsonElement("errorCondition")]
        public double ErrorCondition { get; set; }

        [BsonElement("ID")]
        public string ID { get; set; }
    }

1 Ответ

0 голосов
/ 18 февраля 2019

Я закончил тем, что создал 2 цикла, 1 для дубликатов и еще один для различных значений, это не красиво, но это сработало.

        var builder = Builders<newMsg>.Filter;
        var filter = builder.Eq("Type", "CREATE") & builder.Eq("Entities.ErrorCondition", 14) & builder.Eq("MsgRead", false);

        var result = collection.Find(filter).ToList();

        if (result.Count > 0)
        {
            //Create a list of distinct msgs, then set msgRead to True, then pass that list to a new filter  
            var distinctMsg = collection.Distinct(new StringFieldDefinition<newMsg, string>("Entities.ID"), FilterDefinition<newMsg>.Empty).ToList();
            foreach (var dm in distinctMsg)
            {
                var entityID = dm;
                var msgUnread = Builders<newMsg>.Filter.Eq("msgRead", false);
                var msgUpdate = Builders<newMsg>.Update.Set("msgRead", true);
                var msgIsRead = collection.UpdateOne(msgUnread, msgUpdate);

                //Create another filter on the distinct messages
                CreateDistinctFilter(mongoClient, db, collection, entityID, ec);
            }

            using (IAsyncCursor<newMsg> cursor = await collection.FindAsync(filter))
            {
                while (await cursor.MoveNextAsync())
                {
                    IEnumerable<newMsg> batch = cursor.Current;
                    foreach (newMsg document in batch)
                    {
                        //This gives me the entire list as a string
                        var subDocument = document.Entities;
                        foreach (var sd in subDocument)
                        {
                         //log duplicate msg
                        }
                    }
                }
            }
        }

   static async void CreateDistinctFilter(MongoClient mongoClient, IMongoDatabase db, IMongoCollection<newMsg> collection, string entityID, string ec)
    {
        var builder = Builders<newMsg>.Filter;
        var distinctFilter = builder.Eq("Entities.ID", entityID) & builder.Eq("MsgRead", true);
        var result = collection.Find(distinctFilter).ToList();

        using (IAsyncCursor<newMsg> cursor = await collection.FindAsync(distinctFilter))
        {
            while (await cursor.MoveNextAsync())
            {
                IEnumerable<newMsg> batch = cursor.Current;
                foreach (newMsg document in batch)
                {
                    //This gives me the entire list as a string
                    var subDocument = document.Entities;
                    foreach (var sd in subDocument)
                    {
                        string DeviceName = sd.Name;
                        string Title = DeviceName + " Device DOWN";
                        string Msg = sd.Reason + sd.ID;
                        string ErrorCondition = ec;

                        Console.WriteLine("UNIQUE: " + " " + DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.fff") + Msg );
                        Console.WriteLine();


                        }
                    }
                }
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...