以下是 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 `table` WHERE ( b.c="iamc" AND b.d="iamd") AND _type="model..."
这只是解决方案的一半,因为我假设 b 的每个属性都不是嵌套对象。但当然,我可以有一个递归函数来构造过滤器。
也许另一种方法是处理内存中的所有内容。利用JSON.stringify(b1) == JSON.stringfy(b2)
或_.isEqual(b1, b2)
我几乎可以肯定这不是最佳做法。有什么建议吗?或者只是另一种方法。
**其他信息
如果我希望所有记录都有一个唯一的 b 字段怎么办?我可以使用 b 的字符串化版本作为文档的键。所以当试图查找 b 时,我只是按文档 ID 搜索。不能用 Ottoman 做到这一点,但可以用 couchbase sdk