Сотрудничество для обмена знаниями о серверных технологиях

Оглавление

  1. Операторы и функции PostgreSQL JSON
  2. Предоставить / внедрить в Vue.js

Операторы и функции PostgreSQL JSON

Работа с базой данных может быть интересной, если вы можете манипулировать данными по своему усмотрению. Акита Накарми поделился операторами и функциями Postgres JSON и JSONB, чтобы избавить разработчиков от утомительной и сложной работы и упростить манипулирование данными на уровне базы данных.

PostgreSQL предлагает двоичное представление данных JSON, jsonb начиная с версии 9.4. Типы данных json и jsonb в чем-то похожи, основное различие между ними состоит в том, что json данные хранятся как точная копия входного текста JSON, тогда как jsonb хранит данные в разложенной двоичной форме. Это дает значительное ускорение для увеличения производительности.

Чтобы узнать больше о типе данных thejsonb, перейдите по этой ссылке.

Мы будем использовать приведенную ниже таблицу для наших примеров операторов и функций.

Table Name: users
name  | districts             | metadata
------+-----------------------+-----------------
Harry |["bajhang","kailali"]  |{"age":23,"gender":"male"}
Rahul |["lalitpur"]           |{"age":20,"gender":"male"}
Radhika|["bhaktapur","achham"]|{"age":28,"gender":"female"}

Операторы (‘?’, ‘? |’, ‘? &’)

Оператор ‘?’ Проверяет, присутствует ли данная строка в качестве ключа верхнего уровня в значении JSON.

where '{"Bhaktapur", "lalitpur","aacham}'::jsonb ? 'lalitpur'

‘? |’ Оператор проверяет, существуют ли заданные строки массива как ключи верхнего уровня.

where '{"Bhaktapur", "lalitpur","aacham}'::jsonb ?| array ['lalitpur','kathamdu']

Оператор ‘? &’ Проверяет, существуют ли все эти строки массива как ключи верхнего уровня.

where '{"Bhaktapur", "lalitpur","aacham"}'::jsonb ?& array ['lalitpur','aacham']

Функции

1. json_array_elements ()

Эта функция расширяет массив JSON до набора значений JSON.

select json_array_elements(users.districts)as district from users

Выход:

district
-----------
"bajhang"
"kailali"
"lalitpur"
"bhaktapur"
"aacham"

2. jsonb_exists_any ()

Эта функция проверяет, существует ли данное значение в данных JSON.

select name,districts from users where jsonb_exists_any(districts::jsonb ,array['achham'])

Выход:

name   | districts 
-------+---------------------
Radhika|["bhaktapur","achham"]

3. json_each ()

Эта функция расширяет объект JSON в набор пар ключ / значение.

select name,detail.key,detail.value from  users,json_each(users.metadata) As detail;

Выход:

name   | key   | value 
-------+---------------
Harry  | age   |23   
Harry  | gender|"male"
Rahul  | age   |20
Rahul  | gender|"male"
Radhika| age   |28
Radhika| gender|"female"

4. json_object_keys ()

Эта функция возвращает набор ключей в объекте JSON.

select name,key from users,json_object_keys(users.metadata) As key;

Выход:

name   | key   
-------+-------
Harry  | age   
Harry  | gender
Rahul  | age   
Rahul  | gender
Radhika| age   
Radhika| gender

5. json_build_object ()

Эта функция создает объект JSON из списка аргументов.

select * from json_build_object('age',19,'gender','female') As metadata

Выход:

metadata
----------------------------
{"age":19,"gender":"female"}

Дополнительные сведения см. В документации PostgreSQL здесь.

Предоставить / внедрить в Vue.js

Некоторое время назад мы начали использовать Vue.js для создания сложного пользовательского интерфейса в наших проектах Laravel. По мере того, как проект становится больше и сложнее, любая структура неизбежно станет беспорядочной. Сандип Шреста поделился своим опытом внедрения зависимостей в Vue, благодаря которому передача данных от родительского компонента к его потомкам похожа на прохладный ветерок в жаркий летний день.

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

(Например, родительский компонент может вводить сообщения проверки во входные компоненты.)

Пример:

// parent component providing 'menuOptions' 
var ParentComponent = {   
    data(){
      return {
        menu = ['Home', 'About','Contact'],
      }
    },
    provide: {     
        menuOptions: this.menu   
    },   
    // ... 
}
  
// child component injecting 'menuOptions' 
var ChildComponent = {   
    inject: ['menuOptions'],   
    created () {     
        console.log(this.menuOptions) 
        // output => ['Home', 'About','Contact']   
    }   
    // ... 
}

Вы также можете предоставить и внедрить функцию.

var ParentComponent = {
  data(){
    return {
      menu = ['Home', 'About','Contact'],
    }
  },
  
  methods: {
    getMenu: function() {
      return this.menu;
    },
    setMenu: function(data) {
      this.menu = data;
    },
  },
  
  provide: function() {
    return {
        getMenu:this.getMenu,
        setMenu:this.setMenu
    }
  },
}
var ChildComponent = {
  inject: ["getMenu","setMenu"],  
  
  computed:{
    menu:{
      get:function(){
        return this.getMenu()
      },
      set:function(d){
        this.setMenu(d)
      },
    }
  },
}

Примечание: привязки provide и inject НЕ являются реактивными. Это сделано намеренно. Однако, если вы передаете наблюдаемый объект, свойства этого объекта остаются реактивными.

var ParenmtComponent = {
  provide () {
    const menu = {}
    Object.defineProperty(menu, 'menuOptions', {
       enumerable: true,
       get: () => this.menuOptions,
    })
    return { menu }
  },
  data: () => ({ menuOptions: ['Home', 'About','Contact'] }),
}
var ChildComponent = {
  inject: ['menu'],
  template: `<ul id="example">   
               <li v-for="item in menu">     
                 {{ item }}   
               </li> 
             </ul>`,
}

Инъекции доступны в props и data. Таким образом, вы можете установить введенные данные как prop значения по умолчанию или вы можете использовать инъекции в качестве начального значенияdata.

Подробнее о предоставлении / введении в официальной документации здесь.

Заинтересовавшись, вы можете прочитать наш предыдущий блог.



и два блога, опубликованные на этой неделе нашими фронтендерами.