Результат Couchbase N1QL меняет форму в зависимости от синтаксиса SELECT - PullRequest
0 голосов
/ 23 января 2019

Я новичок в Couchbase, и я столкнулся с поведением, которое действительно беспокоит меня.Допустим, я определил этот класс в C #:

public class Thing
{
    public string Property1 { get; set; }
    public string Property2 { get; set; }
}

Я храню его в Couchbase в контейнере под названием ThingBucket.Теперь, если я войду в Couchbase Query Workbench и введу:

SELECT Property1, Property2 FROM ThingBucket

Я получу обратно объект JSON, который будет десериализован непосредственно в массив Thing:

[
    {
        "Property1": "Value",
        "Property2": "Value"
    }
]

Это хорошо, потому что мне не нужно делать ничего особенного, чтобы заставить его десериализоваться в вещь.Драйвер Couchbase C # вызывает Json.NET для десериализации, и он просто работает.

Однако, если я введу:

SELECT * FROM ThingBucket

, я не получу массив Thing.Я получаю нечто совершенно другое:

[
    {
      "ThingBucket": {
          "Property1": "Value",
          "Property2": "Value"
      }
    }
]

Теперь вместо массива Thing у меня есть массив фигур, которых вообще нет в моем коде C #.Это массив объектов, где каждый объект имеет свойство Thing.Чтобы заставить его десериализоваться в Thing, мне нужно покрыть Thing атрибутами [JsonProperty], которые кажутся избыточными и некрасивыми:

public class Thing
{
    [JsonProperty("Property1")]
    public string Property1 { get; set; }
    [JsonProperty("Property2")]
    public string Property2 { get; set; }
}

Вот как выглядят примеры в документации для CouchbaseNetClient, поэтому кажется, что это ожидаемое поведение.

Есть ли элегантный способ заставить его вернуть исходную форму, не перечисляя каждое свойство в операторе SELECT?Кроме того, есть ли какая-то ценность в этом поведении, которое не видят мои глаза новичка?

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Из-за этого поведения я обычно предпочитаю писать N1QL с такими псевдонимами:

SELECT b.* FROM myBucket b;

Поскольку ваши запросы становятся более сложными (с JOIN, UNNEST и т. Д.), ВыВ любом случае, в любом случае эти псевдонимы понадобятся.

0 голосов
/ 23 января 2019

Возможно, вам нужно ключевое слово RAW.

SELECT c FROM customer c получает вам это:

[
  {
    "c": {
      "Property1": "Value",
      "Property2": "Value"
    }
  }
]

SELECT RAW c FROM customer c получает вам это:

[
  {
    "Property1": "Value",
    "Property2": "Value"
  }
]
...