Запросы TAFFYDB вложенных записей

Я создал модель данных, используя TAFFYDB. Некоторые из полей имеют вложенные записи. Я сталкиваюсь с трудностями при запросе и обновлении вложенных записей.

Например:

var friends = TAFFY([
      {
        "id":1,
        "gender":"M",
        "first":"John",
        "last":"Smith",
        "city":"Seattle, WA",
        "comp": 
        [
          {
            "id":1,
            "audience":"cavern"
          },
          {
            "id":2,
            "audience":"cottage"
          }
        ]
      },
      {
        "id":2,
        "gender":"F",
        "first":"Basic",
        "last":"Smith",
        "city":"Seattle, WA",
        "comp": 
        [
          {
            "id":1,
            "audience":"bush"
          },
          {
            "id":2,
            "audience":"swamp"
          }
        ]
      }

    ]);

Предположим, мне нужно обновить любой из comp это месторождение audienceКак я буду идти об этом?

2 ответа

Решение

Что касается запросов:

Когда у вас есть более простые вложенные массивы, вы должны иметь возможность выбирать конкретные записи, используя методы has и hasAll. Однако существует открытая проблема, в которой говорится, что ни один из этих методов не работает правильно. Есть коммиты, но так как проблема осталась открытой, я предполагаю, что они не исправлены на 100%.

Для сложных вложенных данных, как в вашем примере, единственное, что я нашел, это старая беседа со списком рассылки, в которой говорилось о каком-то методе поиска. Похоже, такого метода не существует, и нет никаких упоминаний о нем в документации.

Что касается обновлений:

Вы должны иметь возможность обновлять данные "comp", передавая измененный JSON, который идет вместе с ним (при условии, что вы в первую очередь можете получить данные из БД) в обычное обновление. Однако существует открытая ошибка, показывающая, что обновление не работает, когда значения записи являются объектами. Таким образом, даже если бы вы могли запрашивать данные и изменять их, вы все равно не сможете обновить запись из-за ошибки. Однако вы можете сделать удаление и вставку.


Несмотря на то, что я обнаружил выше, я провел некоторое тестирование и обнаружил, что вы можете обновлять файлы, передавая объекты. Итак, это быстрый пример того, как сделать простое обновление:

// To show what TAFFYDB looks like:
console.log(friends().stringify());

"[{" id ":1," sex ":"M","first":"John","last":"Smith","city":"Seattle, WA","comp":[{" идентификатор ":1," зрители ":" каверна "},{" ID ":2," зрители ":" коттедж "}],"___ идентификатор ":"T000003R000002","___s": истинно}, { "идентификатор": 2, "пол":"F","first":"Basic","last":"Smith","city":"Seattle, WA","comp":[{"id":1," зрители ":" куст "},{" идентификатор ":2," зрители ":" болото "}],"___ идентификатор ":"T000003R000003","___ лет": истинно}]"

// Get a copy of the comp file from the database for what you want to modify.
// In this example, let's get the **first** record matching people with the name "John Smith":
var johnsComp = friends({first:"John",last:"Smith"}).first().comp;
// Remember, if you want to use select("comp") instead, this will return an array of results.
// So to get the first result, you would need to do this despite there being only one matching result:
// friends({first:"John",last:"Smith"}).select("comp")[0];

// There are no nested queries in TAFFYDB so you need to work with the resulting object as if it were normal javascript.
// You should know the structure and you can either modify things directly, iterate through it, or whatever.
// In this example, I'm just going to change one of the audience values directly:
johnsComp[0].audience = "plains";

// Now let's update that record with the newly modified object.
// Note - if there are more than one "John Smith"s, then all of them will be updated.
friends({first:"John",last:"Smith"}).update({comp:johnsComp});

// To show what TAFFYDB looks like after updating:
console.log(friends().stringify());

"[{" id ":1," sex ":"M","first":"John","last":"Smith","city":"Seattle, WA","comp":[{" идентификатор ":1," зрители ":" равнина "},{" ID ":2," зрители ":" коттедж "}],"___ идентификатор ":" T000003R000002", "___ лет": истинно}, { "идентификатор": 2, "пол":"F","first":"Basic","last":"Smith","city":"Seattle, WA","comp":[{"id":1," зрители ":" куст "},{" идентификатор ":2," зрители ":" болото "}],"___ идентификатор ":"T000003R000003","___ лет": истинно}]"

Для более точного запроса или обновления (что-то, что, возможно, действует как вложенный запрос / обновление), вы можете попробовать передать функцию. Если вы посмотрите на документы, есть простой пример этого для update():

db().update(function () {this.column = "value";return this;}); // sets column to "value" for all matching records

У меня есть пример, в этом случае я сделал обновление для вложенного поля.

Для доступа к данным вы можете сделать так:

console.log( JSON.stringify( 
    data({'id':'489'}).get()[0].review[0][0].comments
))

Это пример того, как это работает

Другие вопросы по тегам