我正在对表单进行一些更新
update(
  { "uuid": someUuid, "revision.versionNumber": someVersionNumber},
  { "$set": { "meta.someId": someId }, "$push": { "meta.someMessages": someMessage } }
)
Run Code Online (Sandbox Code Playgroud)
有时我看的时候这就是所谓的相同uuid,versionNumber,及someId与不同的someMessage第一个更新将会成功,但第二个将静默失败.
我看到蒙戈日志下面,所以我知道该更新能够进入数据库,注意第一次更新具有相同的查询作为第三人,但第一个具有nupdated: 1而第三个具有nupdated: 0
Wed Aug 28 14:50:24 [conn18] update some-db.some_collection query: { uuid: "b841f303-a054-4eb9-8885-9d3ebf9906a1", revision.versionNumber: 9 } update: { $set: { meta.someId: "521e6fe4036420f90371a922" }, $push: { meta.someMessages: { event: "instance.complete", timestamp: new Date(1377726624985) } } } nscanned:2507 nmoved:1 nupdated:1 keyUpdates:0 numYields: 19 locks(micros) w:6010 9ms
Wed Aug 28 …Run Code Online (Sandbox Code Playgroud) 我尝试通过Casbah查询MongoDB的字段是一个带有正则表达式的字符串数组.
例如:
我有一个带有ips列表的Maschine,它们在字段ips中以字符串形式存储.现在我想搜索所有具有子网192.168的计算机.
对我来说,我看起来我无法查询应用于每个条目的regexp的数组,如果其中一个条目匹配,则返回该机器.
有什么方法可以进行这样的查询吗?
- 修正了
谢谢你的帮助.
现在一切都有效.最后我需要解决Casbah的一个限制,因为我需要加入查询$或者Casbah抱怨错误地使用regexp.
我的RegExp Array查询的最终代码包含另外一个字段:
val regexp = ".*" + parameter + ".*"
val nameQ = MongoDBObject("serverName" -> regexp.r)
val ipsQ = MongoDBObject("ips" -> regexp.r)
val bldr = MongoDBList.newBuilder
bldr += ipsQ
bldr += nameQ
val query = MongoDBObject("$or" -> bldr.result.asDBObject)
val result = find(query)
Run Code Online (Sandbox Code Playgroud)
它不是最好的代码,需要修复参数的字符串连接.但它的工作原理:)
我正在使用Play框架和mongoDB创建一个scala应用程序.我设法使用Leon Play-Salat建立联系.我有一个模特
case class Person(
  id: ObjectId = new ObjectId,
  fname: String,
  mname: String,
  lname: String
)
Run Code Online (Sandbox Code Playgroud)
在我的控制器中,我需要将其映射到表单
val personForm: Form[Person] = Form(
// Defines a mapping that will handle Contact values
mapping(
  "id" -> of[ObjectId],
  "fname" -> nonEmptyText,
  "mname" -> text,
  "lname" -> nonEmptyText     
)(Person.apply)(Person.unapply))
Run Code Online (Sandbox Code Playgroud)
如何将ObjectID映射到表单?我收到错误ObjectId找不到Object.
我正在使用Play 2,Salat(用于mongoDB bindin)编写一个Web应用程序.我想在课程模型中测试一些方法(例如测试我通过id检索正确课程的事实).问题是我不想用虚拟课程污染我当前的数据库.如何使用Salat和Scala测试使用假数据库?这是我的一个测试文件.它创建了两个课程,并将其插入到数据库中,并在其上运行一些测试.
LessonSpec extends FlatSpec with ShouldMatchers {
  object FakeApp extends FakeApplication()
  val newLesson1 = Lesson(
    title = "lesson1",
    level = 5,
    explanations = "expl1",
    questions = Seq.empty)
  LessonDAO.insert(newLesson1)
  val newLesson2 = Lesson(
    title = "lesson2",
    level = 5,
    explanations = "expl2",
    questions = Seq.empty)
  LessonDAO.insert(newLesson2)
  "Lesson Model" should "be retrieved by level" in {
    running(FakeApp) {
      assert(Lesson.findByLevel(5).size === 2)
    }
  }
  it should "be of size 0 if no lesson of the level is found" in {
    running(FakeApp) …Run Code Online (Sandbox Code Playgroud) 我正在使用Salat与MongoDB,我正在尝试转换为自然键以避免数据库中的重复.我正在使用的案例类看起来有点像:
case class Foo(someRelatedId: String, email: String ...)
Run Code Online (Sandbox Code Playgroud)
我想添加一个由someRelatedId + email组成的自然键,并让MongoDB使用它而不是默认的ObjectId.从文档中我感觉有可能,但我仍然在寻找一个有效的解决方案.这在很大程度上是由于我对Scala本身缺乏熟练程度,我敢肯定.
更新:我现在有一个有效的解决方案,但我仍然想知道这是否是最好的方法
case class Foo(someRelatedId: String, email: String, naturalKey: String)
object Foo {
  def apply((someRelatedId: String, email: String) {
    apply(someRelatedId, email, someRelatedId+email)
  }
}
Run Code Online (Sandbox Code Playgroud)
然后在package.scala中我映射到自定义salat上下文:
implicit val ctx = new Context() {
  val name = Some("Custom Context")
}
ctx.registerGlobalKeyOverride(remapThis = "naturalKey", toThisInstead = "_id")
Run Code Online (Sandbox Code Playgroud)
这样我避免在我的域类中有一个强制的(无意义的)_id字段,但我必须在伴随对象上重载apply(),这看起来有点笨拙.
我在scala-salat Google小组中问了这个问题,但几天没有回复,因此在这里尝试.
我有一个案例类,其中包含一个集合Option.
case class SomeClass(
  var name:Option[String]=None,
  var addresses:Option[Set[Address]]=None
)
case class Address(
  var street:Option[String]=None,
  var zip:Option[String]=None
) 
Run Code Online (Sandbox Code Playgroud)
该文档存储在Mongo中就好了.但是,当我尝试使用findOne(有或没有SalatDAO)时,地址字段具有表示地址而不是地址案例类的JSON文本.
因此,Lift-JSON会跳过我的case类中的任何字段Option[Collection[A]].当我删除Option并且只是一起使用时addresses=Set[Address](),它可以工作.但是现在我最终在我的JSON中没有数据的空集,如果消费者删除了条目,我无法找到更新,或者我得到一个空,Set因为消费者没有发送此字段原始请求.
使用Option会将字段设置为None,这意味着我不必担心它是空的或修改的.
任何帮助将不胜感激.
我正在使用Casbah和Salat来创建我自己的Mongodb dao并且正在实现这样的getAll方法:
val dao: SalatDAO[T, ObjectId]    
def getAll(): List[T] = dao.find(ref = MongoDBObject()).toList 
Run Code Online (Sandbox Code Playgroud)
我想知道的是:
我想将json转换为Salat模型.我正在使用Play 2.X Scala Json.我找不到任何格式化可空的Seq的文档.根据https://github.com/novus/salat/wiki/SupportedTypes,我不能使用Option [Seq]或Option [List].
以下json是好的,但有时"位置"可能会丢失.
{
    "id": 581407,
    "locations": [
        {
            "id": 1692,
            "tag_type": "LocationTag",
            "name": "san francisco",
            "display_name": "San Francisco"
        }]
}
Run Code Online (Sandbox Code Playgroud)
这些是类:
case class User(
 var id: Int,
 var locations: Seq[Tag] = Seq.empty
)
case class Tag(
  id: Int,
  tag_type:String,
  name:String,
  display_name:String
)
Run Code Online (Sandbox Code Playgroud)
如何格式化可空的"位置"?
implicit val format: Format[User] = (
    (__ \ 'id).format[Int] and
    (__ \ 'locations).formatNullable(Seq[Tag])
)
Run Code Online (Sandbox Code Playgroud) 我有很多记录,下面的结构保存在mongodb中.
case class User(_id:ObjectId = new ObjectId, email:String, role:String, employeeID:Int, createdOn:DateTime)
Run Code Online (Sandbox Code Playgroud)
如何使用salat在mongodb上执行"IN"之类的查询?
例如
val data = UserDAO.find(MongoDbObject("employeeID" -> List(2,4,5)) // (NOT working)
Run Code Online (Sandbox Code Playgroud)
谢谢Pawan
是否可以使用salat库发出带有几个条件的count()查询?
现在我只是在做类似的事情
def countByPoll(pollId: String, option: Int): Int = {
  dao.find(
    MongoDBObject("pollId" -> pollId, "option" -> option)
  ).size
}
Run Code Online (Sandbox Code Playgroud)
但我相信一个计数会表现得更好
我正在尝试开始使用playframework中的salat插件.我已经配置了数据库application.conf并添加了所有依赖项Build.scala并将salat添加到play.plugins文件中.我还没有在项目中添加任何代码,我只是按照github页面上的说明操作,然后尝试运行该项目.我收到以下错误消息
(Server started, use Ctrl+D to stop and go back to the console...)
[info] play - mongodb [default] connected at heroku_app4620908@ds031907.mongolab.com:31907/heroku_app4620908
[error] application - 
! @6bchnaacn - Internal server error, for request [GET /] ->
play.api.Configuration$$anon$1: Configuration error [couldn't connect to [ds031907.mongolab.com/107.21.153.211:31907]]
    at play.api.Configuration$.play$api$Configuration$$configError(Configuration.scala:71) ~[play_2.9.1-2.0.3.jar:2.0.3]
    at play.api.Configuration.reportError(Configuration.scala:258) ~[play_2.9.1-2.0.3.jar:2.0.3]
    at se.radley.plugin.salat.SalatPlugin$$anonfun$onStart$1.apply(SalatPlugin.scala:105) ~[play-plugins-salat_2.9.1-1.0.8.jar:1.0.8]
    at se.radley.plugin.salat.SalatPlugin$$anonfun$onStart$1.apply(SalatPlugin.scala:98) ~[play-plugins-salat_2.9.1-1.0.8.jar:1.0.8]
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:194) ~[scala-library.jar:0.11.3]
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:194) ~[scala-library.jar:0.11.3]
Caused by: com.mongodb.CommandResult$CommandFailure: command failed [listDatabases]: { "serverUsed" : "db-uri" , "errmsg" : "need … 我试图提供一个API来搜索MongoDB集合的各种标准,包括全文搜索.由于这是一个Scala项目(在Play FWIW中),我使用的是Salat,一个围绕Casbah的抽象.
以下代码工作正常:
MySalatDao
.find(MongoDBObject("$text" -> MongoDBObject("$search" -> "Vidya")), MongoDBObject("score" -> MongoDBObject("$meta" -> "textScore")))
.sort(orderBy = MongoDBObject("score" -> MongoDBObject("$meta" -> "textScore")))
Run Code Online (Sandbox Code Playgroud)
但是,我最终需要搜索多个条件并按其全文搜索分数对结果进行排序,因此我探索了Casbah的MongoDBObject 查询构建器功能(在底部).
所以我试着像这样复制上面的内容:
val builder = MongoDBObject.newBuilder
builder += "$text" -> MongoDBObject("$search" -> "Vidya")
builder += "score" -> MongoDBObject("$meta" -> "textScore")
MySalatDao
.find(a.result())
.sort(orderBy = MongoDBObject("score" -> MongoDBObject("$meta" -> "textScore")))
Run Code Online (Sandbox Code Playgroud)
这给出了以下例外:
com.mongodb.MongoException: Can't canonicalize query: BadValue must have $meta projection for all $meta sort keys
  at com.mongodb.QueryResultIterator.throwOnQueryFailure(QueryResultIterator.java:214)
  at com.mongodb.QueryResultIterator.init(QueryResultIterator.java:198)
  at com.mongodb.QueryResultIterator.initFromQueryResponse(QueryResultIterator.java:176)
  at com.mongodb.QueryResultIterator.<init>(QueryResultIterator.java:64)
  at …Run Code Online (Sandbox Code Playgroud)