couchbase, как сопоставить весь дополнительный документ

Вот примеры записей в couchbase

      {
  a: "iama",
  b: {
    c: "iamc",
    d: "iamd",
  },
  f: "iamf"
  // ... other properties we don't care about

}

{
  a: "iama",
  b: {
    c: "iamc",
    d: "iamd"
  },
  f: "iamnotf"
  // ... other properties we don't care about

}

И я хочу найти записи, в которых весь объект b совпадает, но неизвестно, что содержит b.

Я использую ottomanjs, и вот моя попытка. Я считаю это некрасивым.

          const arr = [];
    Object.keys(b).forEach((key) => {
      const k = `b.${key}`;
      arr.push({ [k]: b[key] });
    });

    model.find({ $and: arr });

поэтому в приведенном выше примере фильтр выглядит так:

      {
  "$and": [
    {
      "b.c": "iamc"
    },
    {
      "b.d": "iamd"
    }
  ]
}

он преобразует этот фильтр в запрос n1ql следующим образом:

      SELECT * FROM `triggers` WHERE ( b.c="iamc" AND b.d="iamd") AND _type="model..."

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

Может другой способ - обработать все в памяти. использование JSON.stringify(b1) == JSON.stringfy(b2) или _.isEqual(b1, b2)

Я почти уверен, что это не лучшая практика. любой совет? или просто другой подход.


**Дополнительная информация

Что, если я хочу, чтобы все записи имели уникальное поле b? Я могу использовать строковую версию b в качестве ключа к документу. Поэтому, пытаясь найти b, я просто ищу по идентификатору документа. Невозможно сделать это с пуфиком, но возможно с sdk кушетки.

1 ответ

Просто сделайте WHERE b1 = b2. Он сравнивает имена файлов Json, значение, включая тип значения, в случае позиции массива, рекурсивно вложенную информацию. encode_josn() - это строка.

https://docs.couchbase.com/server/current/n1ql/n1ql-language-reference/datatypes.html#collation

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