Проблема с добавлением записи массива во вложенный документ

#javascript #angularjs #node.js #mongodb #mongoose

#javascript #angularjs #node.js #mongodb #мангуст

Вопрос:

Я работаю над этим уже несколько часов, но я застрял на этом. Я не получаю желаемый результат. Я могу вставить / обновить массив внутри коллекции, но дизайн не совсем то, что я хотел.

Желаемый результат:

 "app_mode_list" : [
        {
            "name" : "Office", 
            "_id" : "OFFICE"
        }, 
        {
            "name" : "Cash and Carry", 
            "_id" : "CASH_AND_CARRY"
        }
    ]
  

Вывод, что я получаю от mongo chef (в коллекции):

 "app_mode_list" : {
        "1" : {
            "name" : "Office", 
            "_id" : "OFFICE"
        }, 
        "0" : {
            "name" : "Cash and Carry", 
            "_id" : "CASH_AND_CARRY"
        }
    }
  

Дизайн схемы:

 var PortalSchema = new Schema({
        name:String,
        app_mode_list :[tokenRefSchema] 
    }, {
        collection:'portal',
        timestamps:{createdAt:'created_at', updatedAt:'updated_at'}
    }
);

var TokenRefSchema = Schema({
        _id:String, 
        name:String
    },
    {_id: false}
);
  

Контроллер:
Я использую имя массива «app_mode_list», чтобы поместить в него все записи.

     app_mode_list.push({"_id":$scope.portalSettings.app_mode_list._id,
"name":$scope.portalSettings.app_mode_list.name});
  

Затем я добавляю этот массив в свою область непосредственно перед использованием, нажимая кнопку сохранения.

 $scope.portalSettings.app_mode_list = app_mode_list;
  

Полный код контроллера:

     angular.module('rugCoPro')

.controller('PortalSettingsController', ['$scope', 'Session', '$location', 'ObjectUtils', '$http', '$state', '$stateParams', 'JsonRest','$mdDialog','$mdToast', function($scope, session, $location, ObjectUtils, $http, $state, $stateParams, JsonRest,$mdDialog,$mdToast){


    if(!session.isAuthenticated()){
        session.logout();
    }

    $http.get("api/models/payroll_frequency").success(function(response, status, headers){
        $scope.payrollFrequencies = response;
    }); 
    $http.get("api/models/app_mode").success(function(response, status, headers){
        $scope.appModes = response;
    });   


    $scope.portalSettings = $stateParams.portal;
    console.log("portalSettings: --->> "  JSON.stringify($scope.portalSettings, null, "    "));


    if(ObjectUtils.isObject($scope.portalSettings)){
        $scope.title = "Editing Settings";
         $scope.app_mode_list = $scope.portalSettings.app_mode_list;
         console.log("1 $scope.app_mode_list : ", JSON.stringify($scope.app_mode_list, null, "   "));
         console.log(" 1 $scope.portalSettings.app_mode_list : ", JSON.stringify( $scope.portalSettings.app_mode_list, null, "   "));

    }

    $scope.cancel = function(){
        $state.go($stateParams.backState);
    };

    $scope.save = function(){
        if(ObjectUtils.isObject($scope.portalSettings)){
            var req;  

            $scope.portalSettings.app_mode_list = ($scope.app_mode_list);

            console.log(" $scope.app_mode_list : ", JSON.stringify($scope.app_mode_list, null, "   "));
            console.log("  $scope.portalSettings.app_mode_list : ", JSON.stringify( $scope.portalSettings.app_mode_list, null, "   "));

            var sendableEntry = JsonRest.sanitize($scope.portalSettings, true);
            req = $http.put("api/portal/"   $scope.portalSettings._id, sendableEntry);

            req.success(function(response, status, headers){
                var user = session.getUser();
                if(ObjectUtils.isObject(response) amp;amp; ObjectUtils.isObject(user)){
                    user.portal = response;
                    session.setUser(user);
                };
                $state.go($stateParams.backState);  
            });
        }

    };


    $scope.app_mode_list = [];

    // a list born with awesome features. 

    // yeah.. welcome aboard a new entry
    $scope.addToList = function(){
       // if(ObjectUtils.isObject($scope.portalSettings.app_mode_list)){
        if($scope.portalSettings.app_mode_list === undefined){
            var msg = "Please select a 'App Mode'!!"
                showSimpleToast(msg);
        }
        else{

            if(findIndexItem($scope.portalSettings.app_mode_list) == '-1'){
                $scope.app_mode_list.push(
                                    {
                                     "_id"  :   $scope.portalSettings.app_mode_list._id,
                                     "name"  :   $scope.portalSettings.app_mode_list.name
                                    }

                            );
                console.log("$scope.app_mode_list : "   JSON.stringify($scope.app_mode_list, null, "   "));

            }
            else{
                var msg = "'"   $scope.portalSettings.app_mode_list.name   "' is already in the list."
                showSimpleToast(msg);
            }
        }
    };

    // sarifice what make you unforgettable. bye bye you old entry!! 
    $scope.deleteFromList = function(item, event){
        var confirmDialog = $mdDialog.confirm()
            .title('Are you sure?')
            .textContent('Do you want to delete <'   item.name   ">?")
            .ariaLabel('Confirm Delete Dialog')
            .ok('Yes')
            .cancel('No')
            .targetEvent(event);

        $mdDialog.show( confirmDialog )
            .then(function(){
                $scope.app_mode_list.splice(findIndexItem(item.name),1);
            });
    };

    // okay scout! lets find your place. :)
    var findIndexItem= function(argu){
        // no need to check the hold         
            var i = null;
            for (i = 0; $scope.app_mode_list.length > i; i  = 1) {
                if ($scope.app_mode_list[i].name == argu.name) {
                    return i;
                }
            }
            return -1;
    }

    //i am hungrey, where is my toast.
    var showSimpleToast = function(msg) {

        $mdToast.show(
          $mdToast.simple()
            .textContent(msg)
            .hideDelay(3000)
            .position('bottom right')
        );
    };

}]);
  

вывод на консоль:
введите описание изображения здесь

Комментарии:

1. я предположил, что вы используете mongo и используете схему mongo. Проблема здесь в вашей схеме

2. Ваш код выглядит нормально, когда вы получаете этот вывод json, поместите соответствующий код контроллера

3. @ArifKhan Я использую mongo chef для просмотра этой коллекции. Я получаю этот вывод после сохранения этой записи.

4. @WasiqMuhammad Да, я использую MongoDB и mongoose для выполнения запросов. Не могли бы вы уточнить, о какой проблеме вы говорите??

5. Можете ли вы предоставить полный код контроллера?