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