Как я могу избежать дубликатов в ScriptDb?

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

Вот код:

// Get a database instance
var database = getDb();

// Create a new employee instance
var myEmployee = {
element: "currentEmployee",
firstName: "",
lastName: "",
ID: 0,
manager: "",
managerEmail: "",
department: "1 - University Store",
startDate: "",
endDate: "",
regularHours: 0,
vacationHours: 0,
sickHours: 0,
personalHours: 0,
H2Hours: 0,
overtimeHours: 0,
totalHours: 0,
rowLocation: 0,
salaryType: "H",
};

var week1 = {
// Identify the week and for query purposes 
element: "Week1",

// User entries
HW: {THUR: 0, FRI: 0, SAT: 0, SUN: 0, MON: 0, TUES: 0, WED: 0},
VH: {THUR: 0, FRI: 0, SAT: 0, SUN: 0, MON: 0, TUES: 0, WED: 0},
SH: {THUR: 0, FRI: 0, SAT: 0, SUN: 0, MON: 0, TUES: 0, WED: 0},
PH: {THUR: 0, FRI: 0, SAT: 0, SUN: 0, MON: 0, TUES: 0, WED: 0},
TH: {THUR: 0, FRI: 0, SAT: 0, SUN: 0, MON: 0, TUES: 0, WED: 0},

// Calculated totals
TotalHW:0, TotalVH: 0, TotalSH: 0, TotalPH: 0, TotalHours: 0,

// Week totals
Vacation: 0, Sick: 0, Personal: 0, H2: 0, OT: 0, Regular: 0,
}

var week2 = {
// Identify the week and for query purposes 
element: "Week2",

// User entries
HW: {THUR: 0, FRI: 0, SAT: 0, SUN: 0, MON: 0, TUES: 0, WED: 0},
VH: {THUR: 0, FRI: 0, SAT: 0, SUN: 0, MON: 0, TUES: 0, WED: 0},
SH: {THUR: 0, FRI: 0, SAT: 0, SUN: 0, MON: 0, TUES: 0, WED: 0},
PH: {THUR: 0, FRI: 0, SAT: 0, SUN: 0, MON: 0, TUES: 0, WED: 0},
TH: {THUR: 0, FRI: 0, SAT: 0, SUN: 0, MON: 0, TUES: 0, WED: 0},

// Calculated totals
TotalHW:0, TotalVH: 0, TotalSH: 0, TotalPH: 0, TotalHours: 0,

// Week totals
Vacation: 0, Sick: 0, Personal: 0, H2: 0, OT: 0, Regular: 0,
}

// Save these to the database
database.save(myEmployee);
database.save(week1);
database.save(week2);

Затем я бы использовал оператор ScriptDb.getMyDb.query({element: element}).next() для извлечения объекта. Строковый элемент, содержащий «currentEmployee», «Week1» или «Week2».


person Hector S.    schedule 31.01.2013    source источник
comment
Не могли бы вы показать код, который вы используете?   -  person Serge insas    schedule 31.01.2013
comment
Код добавлен. Возьмите много, и, надеюсь, вы могли бы мне помочь.   -  person Hector S.    schedule 02.02.2013
comment
До сих пор не совсем понятно, как вы пытаетесь редактировать элементы из БД. Если вы хотите что-то отредактировать в БД, вы должны сначала получить это, затем внести изменения и повторно сохранить.   -  person fooby    schedule 04.02.2013
comment
Я знаю, что должен это сделать. Однако, как только я сохраняю элементы в базу данных, они создаются снова и снова. Каждый раз, когда я запускаю скрипт, появляется больше элементов. Я не хочу больше. Я просто хочу переопределить те, которые я ранее сохранил.   -  person Hector S.    schedule 04.02.2013
comment
Если это то, что вы хотите сделать, вам нужно будет вызвать var obj = db.query({element: elemName}).next(), затем внести изменения в obj, сделав все, что вам нужно, и завершить это с помощью db.save(obj). Не переопределяйте новый объект и не сохраняйте его в базе данных, потому что это создаст новый элемент в базе данных.   -  person Phil Bozak    schedule 07.02.2013
comment
Итак, я должен стереть базу данных, создать объекты один раз, а затем просто устанавливать для всех свойств значения по умолчанию каждый раз, когда я запускаю его, верно?   -  person Hector S.    schedule 08.02.2013


Ответы (1)


Чтобы избежать повторного создания объектов с уникальными ключами в ScriptDb, вы должны сначала проверить, существует ли уже объект, который вы хотите сохранить. Если это так, вам нужно получить дескриптор хранимого объекта, чтобы использовать его для обновлений. Если его там нет, вы save() создадите новый объект, а возвращаемым значением будет дескриптор копии в базе данных.

Общая схема такова:

// Get a database instance
var db = getDb();

var result = db.query( {key:keyval, ...} );
if (result.hasNext()) {
  // The object already exists in ScriptDb
  var obj = result.next()
}
else {
  // The object doesn't exist in ScriptDb, so create it
  // This example would start by creating only the key values,
  // expanding the object during the update stage below.
  // Alternatively, you could create the entire object with all
  // its properties.
  obj = db.save({key:keyval, ...})
}

// Can now update the obj that is in ScriptDb
obj.prop1 = value1;
obj.prop2 = value2;
...

// Save updated object
db.save(obj);

Вот пример того, как этот шаблон можно применить к вашему коду. Здесь вы увидите, что используется альтернативный подход к созданию новых объектов, при котором новый объект создается в ScriptDb сразу со всеми его свойствами.

// Get a database instance
var database = getDb();

// Find or create employee instance
var result = database.query({element: "currentEmployee"});
if (result.hasNext()) {
  var myEmployee = result.next();
} else {
  myEmployee = database.save({
    element: "currentEmployee",
    firstName: "",
    lastName: "",
    ID: 0,
    manager: "",
    managerEmail: "",
    department: "1 - University Store",
    startDate: "",
    endDate: "",
    regularHours: 0,
    vacationHours: 0,
    sickHours: 0,
    personalHours: 0,
    H2Hours: 0,
    overtimeHours: 0,
    totalHours: 0,
    rowLocation: 0,
    salaryType: "H"
  });
};

// Find or create Week1 instance
result = database.query({element: "Week1"});
if (result.hasNext()) {
  var week1 = result.next();
} else {
  week1 = database.save({
    // Identify the week and for query purposes 
    element: "Week1",

    // User entries
    HW: {THUR: 0,FRI: 0,SAT: 0,SUN: 0,MON: 0,TUES: 0,WED: 0},
    VH: {THUR: 0,FRI: 0,SAT: 0,SUN: 0,MON: 0,TUES: 0,WED: 0},
    SH: {THUR: 0,FRI: 0,SAT: 0,SUN: 0,MON: 0,TUES: 0,WED: 0},
    PH: {THUR: 0,FRI: 0,SAT: 0,SUN: 0,MON: 0,TUES: 0,WED: 0},
    TH: {THUR: 0,FRI: 0,SAT: 0,SUN: 0,MON: 0,TUES: 0,WED: 0},

    // Calculated totals
    TotalHW: 0, TotalVH: 0, TotalSH: 0, TotalPH: 0, TotalHours: 0,

    // Week totals
    Vacation: 0, Sick: 0, Personal: 0, H2: 0, OT: 0, Regular: 0,
  });
}

// Find or create Week2 instance
result = database.query({element: "Week2"});
if (result.hasNext()) {
  var week2 = result.next();
} else {
  week2 = database.save({
    // Identify the week and for query purposes 
    element: "Week2",

    // User entries
    HW: {THUR: 0,FRI: 0,SAT: 0,SUN: 0,MON: 0,TUES: 0,WED: 0},
    VH: {THUR: 0,FRI: 0,SAT: 0,SUN: 0,MON: 0,TUES: 0,WED: 0},
    SH: {THUR: 0,FRI: 0,SAT: 0,SUN: 0,MON: 0,TUES: 0,WED: 0},
    PH: {THUR: 0,FRI: 0,SAT: 0,SUN: 0,MON: 0,TUES: 0,WED: 0},
    TH: {THUR: 0,FRI: 0,SAT: 0,SUN: 0,MON: 0,TUES: 0,WED: 0},

    // Calculated totals
    TotalHW: 0, TotalVH: 0, TotalSH: 0, TotalPH: 0, TotalHours: 0,

    // Week totals
    Vacation: 0, Sick: 0, Personal: 0, H2: 0, OT: 0, Regular: 0,
  });
}

// At this point, myEmployee, week1 and week2 refer to the ScriptDb objects.
// While we can use them as any javascript object, they also contain information
// relevant to their state as ScriptDb objects.
...
person Mogsdad    schedule 24.08.2013