Правильная структура данных

233
04 августа 2018, 13:20

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

У меня есть Schema для работы с MongoDB через Mongoose. Юзер сможет заполнять свою информацию в любой момент и в любом порядке. Так есть что бы подтвердить заявку нужно заполнить все поля но база будет хранить и не завершенные запросы для удобности пользователей.

Для этого я добавил еще один массив обьектов который будет служить:

  • Списком всех полей
  • Описанием поля для пользователя
  • Индекс полей что бы сверить с данными из базы и найти что еще не заполнено, после чего продолжить процесс заполнения с последней точки

Проблема в том, что если просто сделать обьект с обьектами я не знаю как удобно запрашивать информацию по индексу И полю. Так есть мне нужно что бы было возможно запросить информацию про каждое поле типа:

Эй, скажи мне что такое name.

  • Пожалуйста: Your name

А что под номером 3?

  • field: "age"

Покажи мне список полей с важностью 1.

1: {field: "name", type: "String", description: "Your name", rank: 1},
2: {field: "nickname", type: "String", description: "Nickname that will be shown to others", rank: 1}

Пример списка:

1: {field: "name", type: "String", description: "Your name", rank: 1},
2: {field: "nickname", type: "String", description: "Nickname that will be shown to others", rank: 1},
3: {field: "age", type: "Number", description: "Your age", rank: 2},

Даже учитывая что можно заполнять в любом порядке важно иметь очередность полей что бы можно было пройтись по всем полям по порядку тем же for или each.

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

Спасибо за внимание, я уже не 1 час сижу пытаюсь понять что делать. Нашел Map(), который работает только для ключа и строки, не сильно полезно, а так же библиотеки collection.js и Buckets JS которые выглядят неплохо, но я побаиваюсь использовать библиотеку для одного лишь списка. А так же JS базы данных: PouchDB и TaffyDB. Первая очень красивая, но у меня чувство что слишком большая для поставленной задачи. Вторая тоже предназначена для куда больших целей чем нужно. Может я не прав, хотелось бы тогда услышать почему.

Answer 1

TaffyDB

Функционал почти как у обычных SQL поддерживает (CRUD), упрощенная выборка и обновление.

// Create DB and fill it with records 
var friends = TAFFY([{ 
    "id": 1, 
    "gender": "M", 
    "first": "John", 
    "last": "Smith", 
    "city": "Seattle, WA", 
    "status": "Active" 
  }, 
  { 
    "id": 2, 
    "gender": "F", 
    "first": "Kelly", 
    "last": "Ruth", 
    "city": "Dallas, TX", 
    "status": "Active" 
  }, 
  { 
    "id": 3, 
    "gender": "M", 
    "first": "Jeff", 
    "last": "Stevenson", 
    "city": "Washington, D.C.", 
    "status": "Active" 
  }, 
  { 
    "id": 4, 
    "gender": "F", 
    "first": "Jennifer", 
    "last": "Gill", 
    "city": "Seattle, WA", 
    "status": "Active" 
  } 
]); 
 
// Find John Smith, by ID 
var id = friends({ 
  id: 1 
}); 
console.log(id.first().first); 
// Get an array of record ids 
var cities = friends().select("id"); 
console.log(cities);
<script src="https://cdnjs.cloudflare.com/ajax/libs/taffydb/2.7.3/taffy-min.js"></script>

Реально проще уже некуда и мало весит.

var cities = TAFFY([{ 
  name: "New York", 
  state: "WA" 
}, { 
  name: "Las Vegas", 
  state: "NV" 
}, { 
  name: "Boston", 
  state: "MA" 
}]); 
 
cities.insert({ 
  name: "Portland", 
  state: "OR" 
}); 
 
console.log(cities({ 
  name: "Boston" 
}).count());
<script src="https://cdnjs.cloudflare.com/ajax/libs/taffydb/2.7.3/taffy-min.js"></script>

PouchDB

Эта будет мощнее синхронизация с локальными и удаленными базами. Непрерывная работа с пользователем и ошибки на сервере её не пугают, сохраняет то что делал юзер и только когда может послать на сервер посылает, отказоустойчива.

//---------------------------------------------------------------- 
// Немного не так легко как с TaffyDB если нет удаленной базы, 
// с другой стороны легко синхронизируется с сервером 
//---------------------------------------------------------------- 
 
var db = new PouchDB('databaseName'); 
db.put(data) 
  .then(res => { 
    console.log(res); /* handling result */ 
  }) 
  .catch(err => { 
    console.log(err); /* errors handling */ 
  }); 
 
db.remove(data) 
  .then(response => { /* handling result */ }) 
  .catch(err => { /* errors handling */ }); 
 
db.get(data) 
  .then(doc => { /* do something with document */ }) 
  .catch(err => { /* errors handling */ }); 
console.log(db.info());
<script src="https://cdnjs.cloudflare.com/ajax/libs/pouchdb/7.0.0/pouchdb.min.js"></script>

Можно почитать тут

READ ALSO
Функция getMiddle(str)

Функция getMiddle(str)

Функция возвращает если число нечетное, средний символ строки, а если четное, то средние два символаА если в строке один символ, то возвращает...

233
Babel не компилирует мой js код

Babel не компилирует мой js код

В старых версиях IE не работает js кодПытаюсь работать через babel

201
Как реализовать анимацию по клику SVG фигур в EDGE и IE?

Как реализовать анимацию по клику SVG фигур в EDGE и IE?

Чтобы не возникало лишних вопросов, и не было предложений, которые не решают вопросаИзменил примеры на оригинал

183
Активное поле после отправки данных на сервер

Активное поле после отправки данных на сервер

есть поле <td class="left"><input type="text" class="packed" placeholder="<?php echo $text_provider_enter?>"></td> в него вносятся данные с помощью сканера и они оправляются...

209