Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过osinka.subset实现MongoDB DBObject级联点表示法_Mongodb_Scala_Syntax_Subset - Fatal编程技术网

如何通过osinka.subset实现MongoDB DBObject级联点表示法

如何通过osinka.subset实现MongoDB DBObject级联点表示法,mongodb,scala,syntax,subset,Mongodb,Scala,Syntax,Subset,作为一个子集用户,我希望生成一个包含两个点的查询,但我不能马上完成。让我增强您的博客帖子示例,以演示我想要实现的目标,即使这样做没有意义: case类子命令(子文本:String) 案例类注释(by:String、vots:Int、text:subcent) 案例类BlogPost(标题:字符串,注释:列表[注释]) 对象子命令{ val text=“text”。fieldOf[字符串] 隐式val writer={ def(sub:subcent):DBObject=(text->sub.su

作为一个子集用户,我希望生成一个包含两个点的查询,但我不能马上完成。让我增强您的博客帖子示例,以演示我想要实现的目标,即使这样做没有意义:

case类子命令(子文本:String)
案例类注释(by:String、vots:Int、text:subcent)
案例类BlogPost(标题:字符串,注释:列表[注释])
对象子命令{
val text=“text”。fieldOf[字符串]
隐式val writer={
def(sub:subcent):DBObject=(text->sub.subText)
ValueWriter(f)
}
}
对象注释{
val by=“by”.fieldOf[String]
val voces=“voces”。fieldOf[Int]
val text=“text”。fieldOf[子命令]
}
对象博客帖子{
val title=“title”.fieldOf[字符串]
val comments=“comments.”[列表[注释]]的子集(注释)
}
val qComment=BlogPost.comments.where{{{{uu.by===“maria”}
val qSubComment=BlogPost.comments.where{…?==“X”}//尚未工作
如何生成DBObject
{“comments.text.subText”:“X”}

谢谢,
彼得

我是《子集》的作者,所以让我绕一小段路,解释一下细节

子集(1.x)提供了
字段[T]
来读取和/或从MongoDB文档(BSON)中写入字段。当您读取或写入字段内容时,它必须知道的唯一事情是
T
。换句话说,如果您使用的是BSON文档,您可以将所有字段声明为
“fieldName”。fieldOf[T]
任何复杂的
T
(例如列表或子文档)

一旦需要创建查询,事情就会变得更加复杂。由于MongoDB支持“点表示法”,子集需要知道父文档和子字段之间的关系。当您将字段声明为[T]的“fieldName”.subset(Obj.)时,这个目标就实现了。这里,
T
实际上与
Obj
没有任何关系
T
Subset用来序列化/反序列化字段内容,而
Obj
只是一个包含字段的容器,Subset将在您调用时返回给您,例如
where

让我举例说明。您只需在代码中更改以下内容:

object Comment {
  ...
  val text = "text".subset(SubComment).of[SubComment]
}
val comments = "comments".subset(()).of[List[Comment]]
val commentText = "text".subset(()).of[SubComment]
val subcommentInnerField = "inner".fieldOf[String]

scala> comments.where { _ =>
     |   commentText.where { _ =>
     |     subcommentInnerField === "X"
     |   }
     | }
res1: com.osinka.subset.package.Query = Query{ "comments.text.inner" : "X"}
然后你会写

scala> val q = BlogPost.comments.where { comment =>
     | comment.text.where { _.text === "X" }
     | }
q: com.osinka.subset.package.Query = Query{ "comments.text.text" : "X"}
这里,
comment
comment
对象


当您知道这一点时,您可以自由地“欺骗”并执行以下操作:

object Comment {
  ...
  val text = "text".subset(SubComment).of[SubComment]
}
val comments = "comments".subset(()).of[List[Comment]]
val commentText = "text".subset(()).of[SubComment]
val subcommentInnerField = "inner".fieldOf[String]

scala> comments.where { _ =>
     |   commentText.where { _ =>
     |     subcommentInnerField === "X"
     |   }
     | }
res1: com.osinka.subset.package.Query = Query{ "comments.text.inner" : "X"}
在这里,我将
Unit
赋予
.subset()
方法,因此我们将
Unit
返回到
where
中。但这并不重要,因为我们知道在调用
的地方使用哪些字段。这种“欺骗”不像将字段保存在对象中那样“安全”,但很好地演示了事物是如何连接的