有一种方法可以在CouchDB上进行某种左连接吗?
我们有由系统创建的默认文档,但用户可以“覆盖”它们。这意味着,创建“系统”拥有的文档副本。结果是文档的修改版本,属性为“owner”=“username”。 用户只能阅读自己的文档,如果不存在,则系统默认。 因此,问题是:有一种方法可以使用选择器或使用能够返回系统文档的函数来查找文档,但是,如果有用户定义的文档,则应该返回该文档,而不是系统默认值 用于查询的参数是:username和docname 通用文件的结构是: { “_id”:“…”, “文件名”:“文件名”, “所有者”:“系统或用户名”有一种方法可以在CouchDB上进行某种左连接吗?,couchdb,Couchdb,我们有由系统创建的默认文档,但用户可以“覆盖”它们。这意味着,创建“系统”拥有的文档副本。结果是文档的修改版本,属性为“owner”=“username”。 用户只能阅读自己的文档,如果不存在,则系统默认。 因此,问题是:有一种方法可以使用选择器或使用能够返回系统文档的函数来查找文档,但是,如果有用户定义的文档,则应该返回该文档,而不是系统默认值 用于查询的参数是:username和docname 通用文件的结构是: { “_id”:“…”, “文件名”:“文件名”, “所有者”:“系统或用户名
}如问题中所述,使用Mango索引和查询基本上可以实现所需的结果 首先,为所有者和文档名
{
"index": {
"fields": [
"docname",
"owner"
]
}
}
要查询所有者John Doe的“文件名3”
假设John Doe没有派生出他们自己版本的“doc name 3”,结果就是系统文档,例如
{
"_id": "821985c5140ca583e108653fb6031665",
"_rev": "3-6de569538ee2b96c3029b10dc052aa6d",
"docname": "doc name 3",
"owner": "System"
}
到目前为止还不错。如果John Doe派生了自己版本的“doc name 3”,则结果将是2行:
{
"_id": "821985c5140ca583e108653fb6031665",
"_rev": "3-6de569538ee2b96c3029b10dc052aa6d",
"docname": "doc name 3",
"owner": "John Doe",
},
{
"_id": "821985c5140ca583e108653fb6031665",
"_rev": "3-6de569538ee2b96c3029b10dc052aa6d",
"docname": "doc name 3",
"owner": "System"
}
好吧,这不是很好,因为代码必须选择赢家,因为如果所有者是Zane Gray,系统文档将首先出现(排序规则)
这就是为什么我在上面主要是因为所有者字段有问题-“系统”确实会妨碍用户名。解决这个问题的一种方法是根据用户名和系统名称在owner字段中指定排序顺序,但这很混乱,令人恶心
理想的做法是将System的owner字段去掉,改用一个数字,比如一个名为的字段,其值大于0表示用户文档,0表示系统文档
保持到目前为止的状态,但现在假设文档中存在派生字段。为派生字段添加新索引,并使用排序:
{
"index": {
"fields": [
{ "derived": "desc" }
]
}
}
现在这个芒果查询
{
"limit": 1,
"selector": {
"$and": [
{
"docname": "doc name 3"
},
{
"owner": {
"$or": [
"System",
"John Doe"
]
}
}
]
}
}
生成系统文档或用户派生版本
该键具有默认的“sort”:“desc”
,它将始终首先显示派生文档,因此“limit”:1
提供单个文档结果;如果存在John Doe的派生文档,并且限制设置为2,则结果类似于
{
"_id": "821985c5140ca583e108653fb6031665",
"_rev": "3-6de569538ee2b96c3029b10dc052aa6d",
"docname": "doc name 3",
"owner": "John Doe",
"derived": 1
},
{
"_id": "821985c5140ca583e108653fb602f396",
"_rev": "3-34f29216b467fe21c65db3e4f1a638ac",
"docname": "doc name 3",
"owner": "System",
"derived": 0
}
我使用Fauxton+CouchDB 2.3来检查我的工作。CouchDB大师可能有一个更好的解决方案。祝你好运。如问题中所述,使用Mango索引和查询基本上可以实现所需的结果 首先,为所有者和文档名
{
"index": {
"fields": [
"docname",
"owner"
]
}
}
要查询所有者John Doe的“文件名3”
假设John Doe没有派生出他们自己版本的“doc name 3”,结果就是系统文档,例如
{
"_id": "821985c5140ca583e108653fb6031665",
"_rev": "3-6de569538ee2b96c3029b10dc052aa6d",
"docname": "doc name 3",
"owner": "System"
}
到目前为止还不错。如果John Doe派生了自己版本的“doc name 3”,则结果将是2行:
{
"_id": "821985c5140ca583e108653fb6031665",
"_rev": "3-6de569538ee2b96c3029b10dc052aa6d",
"docname": "doc name 3",
"owner": "John Doe",
},
{
"_id": "821985c5140ca583e108653fb6031665",
"_rev": "3-6de569538ee2b96c3029b10dc052aa6d",
"docname": "doc name 3",
"owner": "System"
}
好吧,这不是很好,因为代码必须选择赢家,因为如果所有者是Zane Gray,系统文档将首先出现(排序规则)
这就是为什么我在上面主要是因为所有者字段有问题-“系统”确实会妨碍用户名。解决这个问题的一种方法是根据用户名和系统名称在owner字段中指定排序顺序,但这很混乱,令人恶心
理想的做法是将System的owner字段去掉,改用一个数字,比如一个名为的字段,其值大于0表示用户文档,0表示系统文档
保持到目前为止的状态,但现在假设文档中存在派生字段。为派生字段添加新索引,并使用排序:
{
"index": {
"fields": [
{ "derived": "desc" }
]
}
}
现在这个芒果查询
{
"limit": 1,
"selector": {
"$and": [
{
"docname": "doc name 3"
},
{
"owner": {
"$or": [
"System",
"John Doe"
]
}
}
]
}
}
生成系统文档或用户派生版本
该键具有默认的“sort”:“desc”
,它将始终首先显示派生文档,因此“limit”:1
提供单个文档结果;如果存在John Doe的派生文档,并且限制设置为2,则结果类似于
{
"_id": "821985c5140ca583e108653fb6031665",
"_rev": "3-6de569538ee2b96c3029b10dc052aa6d",
"docname": "doc name 3",
"owner": "John Doe",
"derived": 1
},
{
"_id": "821985c5140ca583e108653fb602f396",
"_rev": "3-34f29216b467fe21c65db3e4f1a638ac",
"docname": "doc name 3",
"owner": "System",
"derived": 0
}
我使用Fauxton+CouchDB 2.3来检查我的工作。CouchDB大师可能有一个更好的解决方案。祝你好运。谢谢!我使用了一个类似的aproach(区别在于我在“:[…]中使用了$,而不是“$或“.排序和使用”限制对于1个文档用例来说,这是实现所需行为的一个好方法。但是,当尝试列出许多文档(如所有文档)时,事情会变得更加困难。如果不对结果进行后期处理,则无法通过Mango查询获得所需的结果。这可以通过视图完成,但需要生成一对一用户->系统文档,并利用CouchDB文档中关于的值字段,该解决方案将需要维护。祝您好运!谢谢!我正在使用类似的aproach(区别在于我使用的是$in:[…]而不是“$or”。排序和使用”限制对于1个文档用例来说,这是实现所需行为的一个好方法。但是,当尝试列出许多文档(如所有文档)时,事情会变得更加困难。如果不对结果进行后期处理,则无法通过Mango查询获得所需的结果。这可以通过视图完成,但需要生成一对一用户->系统文档,并利用CouchDB文档中概述的值字段,该解决方案需要维护。祝您好运!