5

JSONでインデックスファイルを作成しています。これは、作業中のjavascriptアプリケーションの一種のデータベースインデックスとして使用しています。

私のインデックスは次のようになります。

{
"_id": "acomplex_indices.json",
"indexAB": {
    "title": {
        "Shawshank Redemption": [
            "0"
        ],
        "Godfather": [
            "1"
        ],
        "Godfather 2": [
            "2"
        ],
        "Pulp Fiction": [
            "3"
        ],
        "The Good, The Bad and The Ugly": [
            "4"
        ],
        "12 Angry Men": [
            "5"
        ],
        "The Dark Knight": [
            "6"
        ],
        "Schindlers List": [
            "7"
        ],
        "Lord of the Rings - Return of the King": [
            "8"
        ],
        "Fight Club": [
            "9"
        ],
        "Star Wars Episode V": [
            "10"
        ],
        "Lord Of the Rings - Fellowship of the Ring": [
            "11"
        ],
        "One flew over the Cuckoo's Nest": [
            "12"
        ],
        "Inception": [
            "13"
        ],
        "Godfellas": [
            "14"
        ]
    },
    "year": {
        "1994": [
            "0",
            "3"
        ],
        "1972": [
            "1"
        ],
        "1974": [
            "2"
        ],
        "1966": [
            "4"
        ],
        "1957": [
            "5"
        ],
        "2008": [
            "6"
        ],
        "1993": [
            "7"
        ],
        "2003": [
            "8"
        ],
        "1999": [
            "9"
        ],
        "1980": [
            "10"
        ],
        "2001": [
            "11"
        ],
        "1975": [
            "12"
        ],
        "2010": [
            "13"
        ],
        "1990": [
            "14"
        ]
    }
}
}

したがって、keyword(パルプフィクションのように)すべてについて、一致するものを保存していdocument-id(s)ます。

私の問題は、上記の例のリリース年のように、整数/数値/非文字列データにあります。これは文字列として保存されますが、数値として保存されることを望んでいました。

私は次のようなインデックスエントリを作成しています:

// indices = the current index file
// doc = the document to update the index with
// priv.indices = all indices defined for this application instance
// priv.indices.fields = index fields e.g. "year", "director", "title"
// priv.indices.name = name of this index

priv.updateIndices = function (indices, doc) {
var i, j, index, value, label, key, l = priv.indices.length;

// loop all indices to add document
for (i = 0; i < l; i += 1) {
  index = {};
  index.reference = priv.indices[i];
  index.reference_size = index.reference.fields.length;
  index.current = indices[index.reference.name];

  for (j = 0; j < index.reference_size; j += 1) {
    label = index.reference.fields[j];    // like "year"
    value = doc[label];                   // like 1985

    // if document has a label field (e.g. doc.year = 1985)
    if (value !== undefined) {

      // check if the index file already contains an entry for 1985
      index.current_size = priv.getObjectSize(index.current[label]);

      if (index.current_size > 0) {
        // check if the document id is already in the index
        // in case the data is updated (e.g. change 1982 to 1985)
        key = priv.searchIndexByValue(
          index.current[label],
          doc._id,
          "key"
        );
        if (!!key) {
          delete index.current[label][key];
        }
      }
      // create a new array if 1985 is not in the index yet
      if (index.current[label][value] === undefined) {
        index.current[label][value] = [];
      }
      // add the document id to an existing entry
      index.current[label][value].push(doc._id);
    }
  }
}
return indices;

};

上記の例の年のように、文字列以外(整数、数値、または日時)として格納するフィールドがインデックスの文字列になることを除いて、これは正常に機能します。

質問
「非文字列」タイプをJSONドキュメントに保存することは可能ですか?その場合、キーと値のペアのキーを「非文字列」要素として保存することもできますか。

そうでない場合は、キー文字列に遭遇したときにキー文字列を変更するために、各キーのタイプを宣言するパラメータをインデックス定義に追加する必要がありますか、それともそれを行うためのより良い方法がありますか?

ありがとう!

4

3 に答える 3

10

「文字列以外の」タイプをJSONドキュメントに保存することは可能ですか?

はい。プロパティの値は、文字列、数値、ブール値、オブジェクト、配列、またはnullにすることができます(undefined注目すべき例外です。これはネイティブJavaScriptタイプですが、有効なJSON値ではありません)。

キーと値のペアのキーを「非文字列」要素として保存することもできますか?

いいえ。キー名は常に文字列である必要があります。ただし、それは、その文字列を他のJavaScriptタイプに解析できないという意味ではありません。たとえば、文字列はあるが数値が必要な場合は、parseInt関数または単項演算子を使用できます+

詳細については、JSON文法を参照してください。

于 2013-02-04T13:12:26.087 に答える
1

いいえ、できません。JSONキーは文字列です。

あなたができる最善のことは、整数であろうとオブジェクトであろうと、それらのキーの文字列表現を保存することです(より複雑な場合は、シリアル化関数を作成する必要があります)。

0から始まる連続した整数キーのみを使用する場合は、配列を使用できます。

于 2013-02-04T13:14:57.913 に答える
1

jsonの仕様によると、値を設定できる場所であればどこでも数値を設定できます。したがって、オブジェクトのキーは文字列である必要がありますが、値は数値にすることができます。また、配列内の任意の値を数値にすることができます。

ただし、仕様は重要ではありません。問題は次の行だと思います。

index.current[label][value].push(doc._id);

あなたが読むときdoc._id、それは文字列です。JSONに数値として保存する場合は、次のようにキャストする必要があります。

index.current[label][value].push(parseInt(doc._id, 10));

また、IDとして数字だけを使用することは有効なHTMLではないことに注意してください。

于 2013-02-04T13:16:59.290 に答える