直截了当,我已阅读: http: //www.couchbase.com/docs/couchbase-manual-2.0/couchbase-views-writing-bestpractice.html以及 Couchbase 网站上的其他各种页面,但以下问题仍然困扰着我所以我想在推出之前仔细检查一下。
如果我有关于产品的文档,请说:
"DocumentType": "productDoc",
"Name": "product",
"Price": 150,
"SellerID": 10,
"DeliverableAUWide": true,
"Colour": "red",
"Size": "large"
假设我想要一个介于 100 到 200 之间的产品,那么:
if(doc.DocumentType == "productDoc" && doc.Price)
{
emit([1, doc.Price], null)
}
会得到我想要的开始和结束键
说我也想按尺寸搜索,那么
if(doc.DocumentType == "productDoc" && doc.Size)
{
emit([2, doc.Size], null)
}
会用正确的搜索键再次得到它。
说我想同时搜索两者,然后:
if(doc.DocumentType == "productDoc" && doc.Size && doc.Price)
{
emit([3, doc.Size, doc.Price], null)
}
会得到的。
现在说我要搜索:价格、SellerID、AU 是否可交付、颜色和尺寸....
if(doc.DocumentType == "productDoc"
&& doc.Price
&& doc.SellerID
&& doc.DeliverableAUWide
&& doc.Colour
&& doc.Size
)
{
emit([4, doc.Price, doc.SellerID, doc.DeliverableAUWide, doc.Colour, doc.Size], null)
}
会得到的。
但是假设我也希望能够按所有期望价格进行搜索,我不能使用上面的,因为价格将为空,因此其余的发射将是“无用的”,因为一切都会匹配.. .
所以我需要一个新的视图查询?例如
if(doc.DocumentType == "productDoc"
&& doc.SellerID
&& doc.DeliverableAUWide
&& doc.Colour
&& doc.Size
)
{
emit([5, doc.SellerID, doc.DeliverableAUWide, doc.Colour, doc.Size], null)
}
问题
这种方法是否正确,因为似乎我需要对每种类型的搜索进行“新”发射调用。所以在.net代码中,我会检查我从用户那里得到的搜索输入,然后调用正确的“发射”(注意:这就是为什么我在发射前面有数字,所以我可以稍后将它们区分开来 - - 为了理智...)。
我不仅关心我必须编写的视图的长度,而且说我稍后会在文档中添加一个字段,例如“折扣金额”,然后我更改视图,其重新索引将是巨大的或? 这是关心吗???
上述结构的可能替代方案???
还是最好只说,
if(doc.DocumentType == "productDoc" && doc.Price)
{
emit([1, doc.Price], null)
}
if(doc.DocumentType == "productDoc" && doc.Size)
{
emit([2, doc.Size], null)
}
然后当我想要按价格和尺寸的产品时,调用两者并有效地获取文档 ID 的“列表”,然后“交叉”这些列表并查看两者中都有哪些 ID,然后调用以获取文档。这种方法但是对 CB 服务器的调用要多得多,而且我也无法使用内置的 skip、limit 和 startkey_docid 进行分页。这在代码方面似乎也更加性能密集。我假设这是 Couchbase 的“错误”心态,但来自一个心态是“更少调用 DB = 更好”的环境,我可能没有正确地接受 CB 哲学......
如果有人可以请:
- 确认第一种方法是正确的...
- 第二个是错的
那很好啊。
如果有什么不明白的地方请告诉我...
提前致谢,
干杯
罗宾
其他注意事项:此文档是存储桶中唯一的文档结构。我只会有 1 个视图。10k 文件 ~ish。