/// <summary>
        /// 添加判据记录,这是记录,需要重新定位数据库和Collection
        /// </summary>
        /// <param name="flight"></param>
        /// <param name="records"></param>
        /// <returns></returns>
        internal string AddDecisionRecordsBatch(FlightDataEntities.Flight flight,
            FlightDataEntities.Decisions.DecisionRecord[] records)
        {
            if (flight == null || records == null || records.Length == 0)
                return string.Empty;

            using (AircraftMongoDbDal dal = new AircraftMongoDbDal())
            {
                MongoServer mongoServer = dal.GetMongoServer();
                //不用判断是否为空,必须不能为空才能继续,否则内部要抛异常
                try
                {//此方法操作的记录为跟架次密切相关,需要拆分存储的记录,最好在DAL里面去处理表名构建逻辑
                    MongoDatabase database = dal.GetMongoDatabaseByAircraftModel(mongoServer, flight.Aircraft.AircraftModel);
                    if (database != null)
                    {
                        MongoCollection<FlightDataEntities.Decisions.DecisionRecord> modelCollection
                            = dal.GetDecisionRecordMongoCollectionByFlight(database, flight);

                        modelCollection.InsertBatch(records);
                    }
                }
                catch (Exception e)
                {
                    LogHelper.Error("AddDecisionRecordsBatch", e);
                    return e.Message;
                }
            }
            return string.Empty;
        }
        /// <summary>
        /// 添加或更新一个架次信息
        /// 架次是实体,用Common库,Collection也可以直接取
        /// </summary>
        /// <param name="flight"></param>
        /// <returns></returns>
        internal FlightDataEntities.Flight AddOrReplaceFlight(
            FlightDataEntities.Flight flight)
        {
            Flight flightResult = null;
            using (AircraftMongoDbDal dal = new AircraftMongoDbDal())
            {
                MongoServer mongoServer = dal.GetMongoServer();
                //不用判断是否为空,必须不能为空才能继续,否则内部要抛异常
                try
                {
                    MongoDatabase database = dal.GetMongoDatabaseCommon(mongoServer);
                    //这是实体,直接取Common吧
                    //dal.GetMongoDatabaseByAircraftModel(mongoServer, flight.Aircraft.AircraftModel);

                    if (database != null)
                    {
                        MongoCollection<Flight> modelCollection
                            = database.GetCollection<Flight>(AircraftMongoDb.COLLECTION_FLIGHT);

                        flightResult = InsertOrUpdateByFlightID(flight, flightResult, modelCollection);
                    }
                }
                catch (Exception e)
                {
                    LogHelper.Error("AddOrReplaceFlight", e);
                    flightResult = null;
                }
            }

            return flightResult;
        }
        internal string AddFlightConditionDecisionRecordsBatch(Flight flight,
            FlightDataEntities.Decisions.DecisionRecord[] records)
        {
            using (AircraftMongoDbDal dal = new AircraftMongoDbDal())
            {
                MongoServer mongoServer = dal.GetMongoServer();
                //不用判断是否为空,必须不能为空才能继续,否则内部要抛异常
                try
                {//此方法操作的记录为跟架次密切相关,但肯定LevelTopRecord需要包含趋势分析等信息,
                    //建议不要分表,存放在Common里面
                    MongoDatabase database = dal.GetMongoDatabaseByAircraftModel(mongoServer, flight.Aircraft.AircraftModel);
                    if (database != null)
                    {
                        MongoCollection<FlightDataEntities.Decisions.DecisionRecord> modelCollection1
                            = dal.GetFlightConditionDecisionRecordMongoCollectionByFlight(database, flight);

                        IMongoQuery q1 = Query.EQ("FlightID", new MongoDB.Bson.BsonString(flight.FlightID));
                        modelCollection1.Remove(q1);

                        modelCollection1.InsertBatch(records);
                    }
                }
                catch (Exception e)
                {
                    LogHelper.Error("AddFlightConditionDecisionRecordsBatch", e);
                    return e.Message;
                }
            }
            return string.Empty;
        }
        /// <summary>
        /// 添加Level1、Level2数据点记录,这是记录,需要重新定位数据库和Collection
        /// </summary>
        /// <param name="flight"></param>
        /// <param name="parameterID"></param>
        /// <param name="reducedRecords"></param>
        /// <param name="level2Record"></param>
        /// <returns></returns>
        internal string AddOneParameterValue(FlightDataEntities.Flight flight, string parameterID,
            FlightDataEntities.Level1FlightRecord[] reducedRecords)
        {
            using (AircraftMongoDbDal dal = new AircraftMongoDbDal())
            {
                MongoServer mongoServer = dal.GetMongoServer();
                //不用判断是否为空,必须不能为空才能继续,否则内部要抛异常
                try
                {//此方法操作的记录为跟架次密切相关,需要拆分存储的记录,最好在DAL里面去处理表名构建逻辑
                    MongoDatabase database = dal.GetMongoDatabaseByAircraftModel(mongoServer, flight.Aircraft.AircraftModel);
                    if (database != null)
                    {
                        MongoCollection<FlightDataEntities.Level1FlightRecord> modelCollection1
                            = dal.GetLevel1FlightRecordMongoCollectionByFlight(database, flight);
                        modelCollection1.InsertBatch(reducedRecords);

                        //MongoCollection<FlightDataEntities.Level2FlightRecord> modelCollection2
                        //    = dal.GetLevel2FlightRecordMongoCollectionByFlight(database, flight);
                        //modelCollection2.InsertBatch(level2Records);
                    }
                }
                catch (Exception e)
                {
                    LogHelper.Error("AddOneParameterValue", e);
                    return e.Message;
                }
            }
            return string.Empty;
        }
        /// <summary>
        /// 删除一个架次相关记录,这是记录,需要重新定位数据库和Collection
        /// </summary>
        /// <param name="mongoServer"></param>
        /// <param name="flight"></param>
        private void RemoveRelatedRecords(MongoServer mongoServer, Flight flight, AircraftMongoDbDal dal,
            IMongoQuery flightIdQuery)
        {//TODO: 
            try
            {//此方法操作的记录为跟架次密切相关,需要拆分存储的记录,最好在DAL里面去处理表名构建逻辑
                MongoDatabase database = dal.GetMongoDatabaseByAircraftModel(mongoServer, flight.Aircraft.AircraftModel);
                if (database != null)
                {
                    //删除判据记录
                    MongoCollection<FlightDataEntities.Decisions.DecisionRecord> modelCollection
                        = dal.GetDecisionRecordMongoCollectionByFlight(database, flight);
                    modelCollection.Remove(flightIdQuery);

                    //删除Level1记录
                    MongoCollection<FlightDataEntities.Level1FlightRecord> modelCollection1
                        = dal.GetLevel1FlightRecordMongoCollectionByFlight(database, flight);
                    modelCollection1.Remove(flightIdQuery);

                    //删除LevelTop记录
                    MongoCollection<FlightDataEntities.LevelTopFlightRecord> modelCollection2
                        = dal.GetLevelTopFlightRecordMongoCollectionByFlight(database, flight);
                    modelCollection2.Remove(flightIdQuery);

                    //删除FlightRawDataRelationPoint记录
                    MongoCollection<FlightDataEntities.FlightRawDataRelationPoint> modelCollection3
                        = dal.GetFlightRawDataRelationPointMongoCollectionByFlight(database, flight);
                    modelCollection3.Remove(flightIdQuery);

                    //删除FlightConditionDecisionRecord记录
                    MongoCollection<FlightDataEntities.Decisions.DecisionRecord> modelCollection4
                        = dal.GetFlightConditionDecisionRecordMongoCollectionByFlight(database, flight);
                    modelCollection4.Remove(flightIdQuery);

                    //删除FlightRawDataRelationPoint记录
                    MongoCollection<FlightDataEntities.ExtremumPointInfo> modelCollection5
                        = dal.GetFlightExtremeMongoCollectionByFlight(database, flight);
                    modelCollection5.Remove(flightIdQuery);

                    //删除FlightExtreme记录
                    MongoCollection<FlightDataEntities.ExtremumPointInfo> modelCollection6
                        = dal.GetFlightExtremeMongoCollectionByFlight(database, flight);
                    modelCollection6.Remove(flightIdQuery);
                }
            }
            catch (Exception e)
            {
                LogHelper.Error("RemoveRelatedRecords", e);
            }
        }
        internal string DeleteFlight(Flight flight)
        {
            using (AircraftMongoDbDal dal = new AircraftMongoDbDal())
            {
                MongoServer mongoServer = dal.GetMongoServer();
                //不用判断是否为空,必须不能为空才能继续,否则内部要抛异常
                try
                {
                    MongoDatabase database = mongoServer.GetDatabase(AircraftMongoDb.DATABASE_COMMON);
                    if (database != null)
                    {
                        MongoCollection<Flight> modelCollection
                            = database.GetCollection<Flight>(AircraftMongoDb.COLLECTION_FLIGHT);
                        ////删除架次
                        IMongoQuery q1 = Query.EQ("FlightID", new MongoDB.Bson.BsonString(flight.FlightID));
                        var writeResult = modelCollection.Remove(q1);
                    }
                }
                catch (Exception e)
                {
                    LogHelper.Error("DeleteFlight", e);
                    return e.Message;
                }
            }

            return string.Empty;
        }
        private MongoCursor<Level1FlightRecord> FindMongoDBCursor(Flight flight, string[] parameterIds,
            int startSecond, int endSecond, AircraftMongoDbDal dal, MongoDatabase database)
        {
            MongoCollection<FlightDataEntities.Level1FlightRecord> modelCollection1
                = dal.GetLevel1FlightRecordMongoCollectionByFlight(database, flight);
            List<IMongoQuery> qs = new List<IMongoQuery>();
            qs.Add(Query.EQ("FlightID", flight.FlightID));
            qs.Add(Query.Or(Query.And(
                            Query.GTE("StartSecond", startSecond),
                            Query.LT("StartSecond", endSecond)),
                    Query.And(
                        Query.GT("EndSecond", startSecond),
                        Query.LTE("EndSecond", endSecond))));
            //最后这个条件是如果一个Level1Record的起始秒、结束秒
            //介于参数起始值和结束值之间,都可以Select,
            //因为区间段基本上是定长的,所以可以这样认定
            if (parameterIds != null && parameterIds.Length > 0)
            {
                var bsonParamID = from id in parameterIds
                                  select new BsonString(id);
                qs.Add(Query.In("ParameterID", bsonParamID));//前两个条件必须:架次、时间
            }

            IMongoQuery q1 = Query.And(qs);

            //var bsonParamID = from id in parameterIds
            //                  select new BsonString(id);

            ////先取出Level1记录
            //IMongoQuery q1 = Query.And(
            //    Query.EQ("FlightID", flight.FlightID),
            //    Query.Or(Query.And(
            //                Query.GTE("StartSecond", startSecond),
            //                Query.LT("StartSecond", endSecond)),
            //        Query.And(
            //            Query.GT("EndSecond", startSecond),
            //            Query.LTE("EndSecond", endSecond))),
            //    //最后这个条件是如果一个Level1Record的起始秒、结束秒
            //    //介于参数起始值和结束值之间,都可以Select,
            //    //因为区间段基本上是定长的,所以可以这样认定
            //    Query.In("ParameterID", bsonParamID) //前两个条件必须:架次、时间
            //            );

            var cursor = modelCollection1.Find(q1);
            return cursor;
        }
        internal string AddOrReplaceAircraftInstance(AircraftInstance instance)
        {
            using (AircraftMongoDbDal dal = new AircraftMongoDbDal())
            {
                MongoServer mongoServer = dal.GetMongoServer();
                //不用判断是否为空,必须不能为空才能继续,否则内部要抛异常
                try
                {//此方法操作的记录为跟架次密切相关,但肯定LevelTopRecord需要包含趋势分析等信息,
                    //建议不要分表,存放在Common里面
                    MongoDatabase database = dal.GetMongoDatabaseByAircraftModel(mongoServer, instance.AircraftModel);
                    if (database != null)
                    {
                        MongoCollection<FlightDataEntities.AircraftInstance> modelCollection
                            = dal.GetAircraftInstanceCollection(database);

                        IMongoQuery q1 = Query.EQ("AircraftNumber", new MongoDB.Bson.BsonString(instance.AircraftNumber));

                        MongoCursor<AircraftInstance> cursor = modelCollection.Find(q1);

                        if (cursor != null && cursor.Count() > 0)
                        {
                            foreach (var value in cursor.AsEnumerable())
                            {
                                value.LastUsed = instance.LastUsed;
                                value.AircraftModel = value.AircraftModel;
                                modelCollection.Save(value);
                            }
                        }
                        else
                        {//如果INSERT,就必须插入之后才有ObjectId,需要返回带有ObjectId的对象(不单单只考虑WCF返回没带有ObjectId的情况)
                            modelCollection.Insert(instance);

                            var cursor2 = modelCollection.Find(q1);
                            if (cursor2 != null && cursor2.Count() > 0)
                            {
                                instance = cursor2.First();
                            }
                            else instance = null;
                        }
                    }
                }
                catch (Exception e)
                {
                    LogHelper.Error("AddOrReplaceAircraftInstance", e);
                    return e.Message;
                }
            }
            return string.Empty;
        }
        internal FlightRawDataRelationPoint[] GetFlightRawDataRelationPoints(AircraftModel aircraft, string flightID,
            string XAxisParameterID, string YAxisParameterID)
        {
            if (string.IsNullOrEmpty(flightID))
            {
                LogHelper.Warn("flight为空或FlightID为空(GetFlightRawDataRelationPoints)。", null);
                return null;
            }

            using (AircraftMongoDbDal dal = new AircraftMongoDbDal())
            {
                MongoServer mongoServer = dal.GetMongoServer();
                //不用判断是否为空,必须不能为空才能继续,否则内部要抛异常
                try
                {//此方法操作的记录为跟架次密切相关,需要拆分存储的记录,最好在DAL里面去处理表名构建逻辑
                    MongoDatabase database =
                        dal.GetMongoDatabaseByAircraftModel(mongoServer,
                        aircraft);
                    if (database != null)
                    {
                        MongoCollection<FlightDataEntities.FlightRawDataRelationPoint> modelCollection
                            = dal.GetFlightRawDataRelationPointsMongoCollection(database, flightID);

                        List<IMongoQuery> qs = new List<IMongoQuery>();
                        IMongoQuery q1 = Query.EQ("FlightID", flightID);
                        if (!string.IsNullOrEmpty(XAxisParameterID))
                        {
                            IMongoQuery q2 = Query.EQ("XAxisParameterID", XAxisParameterID);
                            qs.Add(q2);
                        }
                        if (!string.IsNullOrEmpty(YAxisParameterID))
                        {
                            IMongoQuery q3 = Query.EQ("YAxisParameterID", YAxisParameterID);
                            qs.Add(q3);
                        }

                        if (qs.Count == 0)
                        {
                            var cursor = modelCollection.Find(q1);
                            var result = cursor.AsQueryable();
                            return result.ToArray();
                        }
                        else
                        {
                            qs.Insert(0, q1);
                            IMongoQuery all = Query.And(qs);
                            var cursor = modelCollection.Find(all);
                            var result = cursor.AsQueryable();
                            return result.ToArray();
                        }
                    }
                }
                catch (Exception e)
                {
                    LogHelper.Error("GetFlightRawDataRelationPoints", e);
                }
            }
            return null;
        }
        internal KeyValuePair<string, FlightRawData[]>[] GetFlightData(
            Flight flight, string[] parameterIds, int startSecond, int endSecond)
        {
            if (flight == null || string.IsNullOrEmpty(flight.FlightID)
                || flight.Aircraft == null || flight.Aircraft.AircraftModel == null
                || string.IsNullOrEmpty(flight.Aircraft.AircraftModel.ModelName))
            {
                LogHelper.Warn("Flight或Aircraft信息不正确(GetFlightData)。", null);
                return null;
            }

            if (startSecond == flight.StartSecond && endSecond == flight.EndSecond)
            {//应该取最顶层数据,暂时未实现此Return

            }

            using (AircraftMongoDbDal dal = new AircraftMongoDbDal())
            {
                MongoServer mongoServer = dal.GetMongoServer();
                //不用判断是否为空,必须不能为空才能继续,否则内部要抛异常
                try
                {//此方法操作的记录为跟架次密切相关,需要拆分存储的记录,最好在DAL里面去处理表名构建逻辑
                    MongoDatabase database = dal.GetMongoDatabaseByAircraftModel(mongoServer, flight.Aircraft.AircraftModel);
                    if (database != null)
                    {
                        var cursor = FindMongoDBCursor(flight, parameterIds, startSecond, endSecond, dal, database);
                        //var queryable = cursor.AsQueryable();
                        //转换成RawData记录
                        var result = TransformToFlightRawData(parameterIds, cursor);
                        return result.ToArray();
                    }
                }
                catch (Exception e)
                {
                    LogHelper.Error("GetFlightData", e);
                }
            }
            return null;
        }
        internal DecisionRecord[] GetFlightConditionDecisionRecords(AircraftModel model,
            DateTime startYearMonth, DateTime endYearMonth, string[] aircraftNumbers)
        {
            using (AircraftMongoDbDal dal = new AircraftMongoDbDal())
            {
                MongoServer mongoServer = dal.GetMongoServer();
                //不用判断是否为空,必须不能为空才能继续,否则内部要抛异常
                try
                {//此方法操作的记录为跟架次密切相关,但肯定LevelTopRecord需要包含趋势分析等信息,
                    //建议不要分表,存放在Common里面
                    MongoDatabase database = dal.GetMongoDatabaseByAircraftModel(mongoServer, model);

                    IMongoQuery q1 = Query.GTE("FlightDate", new BsonDateTime(startYearMonth));
                    IMongoQuery q2 = Query.LTE("FlightDate", new BsonDateTime(endYearMonth));

                    IMongoQuery q0 = null;
                    if (database != null)
                    {
                        if (aircraftNumbers != null && aircraftNumbers.Length > 0)
                        {
                            MongoCollection<Flight> modelCollection1 =
                                database.GetCollection<Flight>(AircraftMongoDb.COLLECTION_FLIGHT);

                            var queryableFlights = modelCollection1.AsQueryable();
                            var flights = from oneFlight in queryableFlights
                                          where oneFlight.Aircraft != null && oneFlight.Aircraft.AircraftModel != null
                                          && oneFlight.Aircraft.AircraftModel.ModelName == model.ModelName
                                          && oneFlight.FlightDate > startYearMonth && oneFlight.FlightDate <= endYearMonth
                                          && aircraftNumbers.Contains(oneFlight.Aircraft.AircraftNumber)
                                          select oneFlight.FlightID;

                            var flights2 = flights.Distinct();

                            List<MongoDB.Bson.BsonString> list = new List<BsonString>();
                            foreach (var f in flights2)
                            {
                                list.Add(new BsonString(f));
                            }
                            q0 = Query.In("FlightID", list);
                        }
                    }

                    MongoCollection<FlightDataEntities.Decisions.DecisionRecord> modelCollection2
                        = dal.GetFlightConditionDecisionRecordMongoCollectionByFlight(database, null);//没有按Flight分割的

                    IMongoQuery query = q0;//(q0 == null) ? Query.And(q1, q2) : Query.And(q1, q2, q0);

                    if (query != null)
                    {
                        var cursor = modelCollection2.Find(query);

                        return cursor.ToArray();
                    }

                    return new DecisionRecord[] { };
                }
                catch (Exception e)
                {
                    LogHelper.Error("GetFlightConditionDecisionRecords", e);
                    return new DecisionRecord[] { };
                }
            }

            return new DecisionRecord[] { };
        }
        internal ExtremumPointInfo[] GetExtremumPointInfos(AircraftInstance aircraftInstance)
        {
            if (aircraftInstance == null || string.IsNullOrEmpty(aircraftInstance.AircraftNumber))
            {
                LogHelper.Warn("aircraftInstance为空或AircraftNumber为空(GetExtremumPointInfos)。", null);
                return null;
            }

            using (AircraftMongoDbDal dal = new AircraftMongoDbDal())
            {
                MongoServer mongoServer = dal.GetMongoServer();
                //不用判断是否为空,必须不能为空才能继续,否则内部要抛异常
                try
                {//此方法操作的记录为跟架次密切相关,需要拆分存储的记录,最好在DAL里面去处理表名构建逻辑
                    MongoDatabase database =
                        dal.GetMongoDatabaseByAircraftModel(mongoServer,
                        aircraftInstance.AircraftModel);
                    if (database != null)
                    {
                        MongoCollection<FlightDataEntities.ExtremumPointInfo> modelCollection
                            = dal.GetFlightExtremeMongoCollectionByFlight(database, null);

                        List<IMongoQuery> qs = new List<IMongoQuery>();
                        IMongoQuery q1 = Query.EQ("AircraftNumber", aircraftInstance.AircraftNumber);
                        var cursor = modelCollection.Find(q1);
                        var result = cursor.AsQueryable();
                        return result.ToArray();
                    }
                }
                catch (Exception e)
                {
                    LogHelper.Error("GetFlightRawDataRelationPoints", e);
                }
            }
            return null;
        }
        internal int GetEarliestYear(AircraftModel model)
        {
            if (model == null || string.IsNullOrEmpty(model.ModelName))
            {
                LogHelper.Warn("aircraftModel为空或aircraftModel.ModelName为空或FlightID为空(GetEarliestYear)。", null);
                return DateTime.Now.Year;
            }

            using (AircraftMongoDbDal dal = new AircraftMongoDbDal())
            {
                MongoServer mongoServer = dal.GetMongoServer();
                //不用判断是否为空,必须不能为空才能继续,否则内部要抛异常
                try
                {//此方法操作的记录为跟架次密切相关,需要拆分存储的记录,最好在DAL里面去处理表名构建逻辑
                    MongoDatabase database = dal.GetMongoDatabaseCommon(mongoServer);
                    if (database != null)
                    {
                        if (database != null)
                        {
                            MongoCollection<Flight> modelCollection
                                = database.GetCollection<Flight>(AircraftMongoDb.COLLECTION_FLIGHT);

                            var queryable = modelCollection.AsQueryable();
                            var result = from one in queryable
                                         where one.Aircraft != null && one.Aircraft.AircraftModel != null
                                         && one.Aircraft.AircraftModel.ModelName == model.ModelName
                                         select Convert.ToInt32(one.FlightDate.Year);

                            if (result != null && result.Count() > 0)
                            {
                                return result.ToArray().Min();
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    LogHelper.Error("GetAllAircrafts", e);
                }
            }
            return DateTime.Now.Year;
        }
        internal FlightDataEntities.Decisions.DecisionRecord[] GetDecisionRecords(Flight flight)
        {
            if (flight == null || string.IsNullOrEmpty(flight.FlightID))
            {
                LogHelper.Warn("flight为空或FlightID为空(GetDecisionRecords)。", null);
                return null;
            }

            using (AircraftMongoDbDal dal = new AircraftMongoDbDal())
            {
                MongoServer mongoServer = dal.GetMongoServer();
                //不用判断是否为空,必须不能为空才能继续,否则内部要抛异常
                try
                {//此方法操作的记录为跟架次密切相关,需要拆分存储的记录,最好在DAL里面去处理表名构建逻辑
                    MongoDatabase database =
                        dal.GetMongoDatabaseByAircraftModel(mongoServer,
                        flight.Aircraft.AircraftModel);
                    if (database != null)
                    {
                        MongoCollection<FlightDataEntities.Decisions.DecisionRecord> modelCollection
                            = dal.GetDecisionRecordMongoCollectionByFlight(database, flight);

                        IMongoQuery q1 = Query.EQ("FlightID", flight.FlightID);
                        var cursor = modelCollection.Find(q1);
                        var result = cursor.AsQueryable();
                        return result.ToArray();
                    }
                }
                catch (Exception e)
                {
                    LogHelper.Error("AddDecisionRecordsBatch", e);
                }
            }
            return null;
        }
        internal Flight[] GetAllFlights(AircraftModel model, AircraftInstance instance)
        {
            if (model == null || string.IsNullOrEmpty(model.ModelName))
            {
                LogHelper.Warn("model为空或ModelName为空(GetAllFlights)。", null);
                return null;
            }

            if (instance == null || string.IsNullOrEmpty(instance.AircraftNumber))
                return GetAllFlights(model);

            using (AircraftMongoDbDal dal = new AircraftMongoDbDal())
            {
                MongoServer mongoServer = dal.GetMongoServer();
                //不用判断是否为空,必须不能为空才能继续,否则内部要抛异常
                try
                {
                    MongoDatabase database = dal.GetMongoDatabaseCommon(mongoServer);
                    //这是实体,直接取Common吧
                    //dal.GetMongoDatabaseByAircraftModel(mongoServer, flight.Aircraft.AircraftModel);

                    if (database != null)
                    {
                        MongoCollection<Flight> modelCollection
                            = database.GetCollection<Flight>(AircraftMongoDb.COLLECTION_FLIGHT);

                        var queryable = modelCollection.AsQueryable();
                        var result = from one in queryable
                                     where one.Aircraft != null && one.Aircraft.AircraftModel != null
                                     && one.Aircraft.AircraftModel.ModelName == model.ModelName
                                     && one.Aircraft.AircraftNumber == instance.AircraftNumber //加上机号判断
                                     select one;

                        return result.ToArray();
                    }
                }
                catch (Exception e)
                {
                    LogHelper.Error("GetAllFlights", e);
                }
            }

            return null;
        }
        internal string AddLevelTopFlightRecords(Flight flight, LevelTopFlightRecord[] topRecords)
        {
            using (AircraftMongoDbDal dal = new AircraftMongoDbDal())
            {
                MongoServer mongoServer = dal.GetMongoServer();
                //不用判断是否为空,必须不能为空才能继续,否则内部要抛异常
                try
                {//此方法操作的记录为跟架次密切相关,但肯定LevelTopRecord需要包含趋势分析等信息,
                    //建议不要分表,存放在Common里面
                    MongoDatabase database = dal.GetMongoDatabaseByAircraftModel(mongoServer, flight.Aircraft.AircraftModel);
                    if (database != null)
                    {
                        MongoCollection<FlightDataEntities.LevelTopFlightRecord> modelCollection1
                            = dal.GetLevelTopFlightRecordMongoCollectionByFlight(database, flight);
                        modelCollection1.InsertBatch(topRecords);

                        //MongoCollection<FlightDataEntities.Level2FlightRecord> modelCollection2
                        //    = dal.GetLevel2FlightRecordMongoCollectionByFlight(database, flight);
                        //modelCollection2.InsertBatch(level2Records);
                    }
                }
                catch (Exception e)
                {
                    LogHelper.Error("AddLevelTopFlightRecords", e);
                    return e.Message;
                }
            }
            return string.Empty;
        }
        internal string AddOrReplaceFlightGlobeDataBatch(string flightId, AircraftModel model,
            int startIndex, int endIndex, FlightDataEntities.GlobeData[] globedatas)
        {
            using (AircraftMongoDbDal dal = new AircraftMongoDbDal())
            {
                MongoServer mongoServer = dal.GetMongoServer();
                //不用判断是否为空,必须不能为空才能继续,否则内部要抛异常
                try
                {//此方法操作的记录为跟架次密切相关,但肯定LevelTopRecord需要包含趋势分析等信息,
                    //建议不要分表,存放在Common里面
                    MongoDatabase database = dal.GetMongoDatabaseByAircraftModel(mongoServer, model);
                    if (database != null)
                    {
                        MongoCollection<FlightDataEntities.GlobeData> modelCollection1
                            = dal.GetFlightGlobeDataMongoCollectionByFlight(database, flightId);

                        IMongoQuery q1 = Query.EQ("FlightID", new MongoDB.Bson.BsonString(flightId));
                        IMongoQuery q2 = Query.GTE("Index", new MongoDB.Bson.BsonInt32(startIndex));
                        IMongoQuery q3 = Query.LTE("Index", new MongoDB.Bson.BsonInt32(endIndex));
                        IMongoQuery q4 = Query.EQ("AircraftModelName", new MongoDB.Bson.BsonString(model.ModelName));
                        IMongoQuery query = Query.And(q1, q2, q3, q4);
                        modelCollection1.Remove(query);

                        modelCollection1.InsertBatch(globedatas);
                    }
                }
                catch (Exception e)
                {
                    LogHelper.Error("AddOrReplaceFlightGlobeDataBatch", e);
                    return e.Message;
                }
            }
            return string.Empty;
        }
        internal GlobeData[] GetGlobeDatas(string flightID, AircraftModel model, int startIndex, int endIndex)
        {
            if (model == null || string.IsNullOrEmpty(model.ModelName) || string.IsNullOrEmpty(flightID))
            {
                LogHelper.Warn("aircraftModel为空或aircraftModel.ModelName为空或FlightID为空(GetGlobeDatas)。", null);
                return null;
            }

            using (AircraftMongoDbDal dal = new AircraftMongoDbDal())
            {
                MongoServer mongoServer = dal.GetMongoServer();
                //不用判断是否为空,必须不能为空才能继续,否则内部要抛异常
                try
                {//此方法操作的记录为跟架次密切相关,需要拆分存储的记录,最好在DAL里面去处理表名构建逻辑
                    MongoDatabase database =
                        dal.GetMongoDatabaseByAircraftModel(mongoServer, model);
                    if (database != null)
                    {
                        MongoCollection<FlightDataEntities.GlobeData> modelCollection
                            = dal.GetFlightGlobeDataMongoCollectionByFlight(database, flightID);

                        List<IMongoQuery> qs = new List<IMongoQuery>();

                        IMongoQuery q1 = Query.EQ("FlightID", new MongoDB.Bson.BsonString(flightID));
                        IMongoQuery q2 = Query.GTE("Index", new MongoDB.Bson.BsonInt32(startIndex));
                        IMongoQuery q3 = Query.LTE("Index", new MongoDB.Bson.BsonInt32(endIndex));
                        IMongoQuery q4 = Query.EQ("AircraftModelName", new MongoDB.Bson.BsonString(model.ModelName));
                        IMongoQuery query = Query.And(q1, q2, q3, q4);

                        var cursor = modelCollection.Find(query);
                        var result = cursor.AsQueryable();
                        return result.ToArray();
                    }
                }
                catch (Exception e)
                {
                    LogHelper.Error("GetGlobeDatas", e);
                }
            }
            return null;
        }
        internal string DeleteAircraftInstance(AircraftInstance instance)
        {
            using (AircraftMongoDbDal dal = new AircraftMongoDbDal())
            {
                MongoServer mongoServer = dal.GetMongoServer();
                //不用判断是否为空,必须不能为空才能继续,否则内部要抛异常
                try
                {//此方法操作的记录为跟架次密切相关,但肯定LevelTopRecord需要包含趋势分析等信息,
                    //建议不要分表,存放在Common里面
                    MongoDatabase database = dal.GetMongoDatabaseByAircraftModel(mongoServer, instance.AircraftModel);
                    if (database != null)
                    {
                        MongoCollection<FlightDataEntities.AircraftInstance> modelCollection
                            = dal.GetAircraftInstanceCollection(database);

                        IMongoQuery q1 = Query.EQ("AircraftNumber", new MongoDB.Bson.BsonString(instance.AircraftNumber));

                        MongoCursor<AircraftInstance> cursor = modelCollection.Find(q1);

                        if (cursor != null && cursor.Count() > 0)
                        {
                            //foreach (var value in cursor.AsEnumerable())
                            //{
                            //    value.LastUsed = instance.LastUsed;
                            //    value.AircraftModel = value.AircraftModel;
                            //}//.Save(value);
                        }
                        modelCollection.Remove(q1);
                    }
                }
                catch (Exception e)
                {
                    LogHelper.Error("DeleteAircraftInstance", e);
                    return e.Message;
                }
            }
            return string.Empty;
        }
        /// <summary>
        /// 不急着做,TopLevel还
        /// </summary>
        /// <param name="flight"></param>
        /// <param name="parameterIds"></param>
        /// <param name="withLevel1Data"></param>
        /// <returns></returns>
        internal LevelTopFlightRecord[] GetLevelTopFlightRecords(Flight flight, string[] parameterIds)
        {
            using (AircraftMongoDbDal dal = new AircraftMongoDbDal())
            {
                MongoServer mongoServer = dal.GetMongoServer();
                //不用判断是否为空,必须不能为空才能继续,否则内部要抛异常
                try
                {//此方法操作的记录为跟架次密切相关,但肯定LevelTopRecord需要包含趋势分析等信息,
                    //建议不要分表,存放在Common里面
                    MongoDatabase database = dal.GetMongoDatabaseByAircraftModel(mongoServer, flight.Aircraft.AircraftModel);
                    if (database != null)
                    {
                        MongoCollection<FlightDataEntities.LevelTopFlightRecord> modelCollection1
                            = dal.GetLevelTopFlightRecordMongoCollectionByFlight(database, flight);

                        IMongoQuery q1 = null;

                        if (parameterIds == null || parameterIds.Length == 0)
                            q1 = Query.EQ("FlightID", new BsonString(flight.FlightID));
                        else
                            q1 = Query.And(Query.EQ("FlightID", new BsonString(flight.FlightID)),
                                Query.In("ParameterID", (from pm in parameterIds select new BsonString(pm))));

                        var cursor = modelCollection1.Find(q1);

                        return cursor.ToArray();
                    }
                }
                catch (Exception e)
                {
                    LogHelper.Error("GetLevelTopFlightRecords", e);
                    return new LevelTopFlightRecord[] { };
                }
            }
            return new LevelTopFlightRecord[] { };
        }