MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

प्ले:JSON को MongoDB से लिखते/पढ़ते समय कैसे रूपांतरित करें?

JsonExtensions

मेरे पास आमतौर पर मेरे एप्लिकेशन में एक JsExtensions ऑब्जेक्ट होता है जो निम्न जैसा दिखता है:

import reactivemongo.bson.BSONObjectID
object JsonExtensions {

  import play.api.libs.json._

  def withDefault[A](key: String, default: A)(implicit writes: Writes[A]) = __.json.update((__ \ key).json.copyFrom((__ \ key).json.pick orElse Reads.pure(Json.toJson(default))))
  def copyKey(fromPath: JsPath,toPath:JsPath ) = __.json.update(toPath.json.copyFrom(fromPath.json.pick))
  def copyOptKey(fromPath: JsPath,toPath:JsPath ) = __.json.update(toPath.json.copyFrom(fromPath.json.pick orElse Reads.pure(JsNull)))
  def moveKey(fromPath:JsPath, toPath:JsPath) =(json:JsValue)=> json.transform(copyKey(fromPath,toPath) andThen fromPath.json.prune).get
}

एक साधारण मॉडल के लिए

case class SOUser(name:String,_id:BSONObjectID)

आप इस तरह अपना जेसन सीरिएलाइज़र/deserializer लिख सकते हैं:

object SOUser{
  import play.api.libs.json.Format
  import play.api.libs.json.Json
  import play.modules.reactivemongo.json.BSONFormats._

  implicit val soUserFormat= new Format[SOUser]{
    import play.api.libs.json.{JsPath, JsResult, JsValue}
    import JsonExtensions._
    val base = Json.format[SOUser]
    private val publicIdPath: JsPath = JsPath \ 'id
    private val privateIdPath: JsPath = JsPath \ '_id \ '$oid

    def reads(json: JsValue): JsResult[SOUser] = base.compose(copyKey(publicIdPath, privateIdPath)).reads(json)
    def writes(o: SOUser): JsValue = base.transform(moveKey(privateIdPath,publicIdPath)).writes(o)
  }
}

यहाँ आपको कंसोल में क्या मिलता है:

scala> import reactivemongo.bson.BSONObjectID
import reactivemongo.bson.BSONObjectID

scala> import models.SOUser
import models.SOUser

scala> import play.api.libs.json.Json
import play.api.libs.json.Json

scala>

scala> val user = SOUser("John Smith", BSONObjectID.generate)
user: models.SOUser = SOUser(John Smith,BSONObjectID("52d00fd5c912c061007a28d1"))

scala> val jsonUser=Json.toJson(user)
jsonUser: play.api.libs.json.JsValue = {"name":"John Smith","id":"52d00fd5c912c061007a28d1","_id":{}}

scala> Json.prettyPrint(jsonUser)
res0: String =
{
  "name" : "John Smith",
  "id" : "52d00fd5c912c061007a28d1",
  "_id" : { }
}

scala> jsonUser.validate[SOUser]
res1: play.api.libs.json.JsResult[models.SOUser] = JsSuccess(SOUser(John Smith,BSONObjectID("52d00fd5c912c061007a28d1")),/id)

इसे अपने उदाहरण पर लागू करना

val _personReads: Reads[JsObject] = (
  (__ \ 'id).read[String] ~
  (__ \ 'name).read[String] ~
  (__ \ 'surname).read[String]
).reduce

डिफ़ॉल्ट रूप से संकलित नहीं होता है, मुझे लगता है कि आप लिखना चाहते थे:

val _personReads: Reads[(String,String,String)] = (
  (__ \ 'id).read[String] ~
  (__ \ 'name).read[String] ~
  (__ \ 'surname).read[String]
).tupled

किस स्थिति में आप निम्न कार्य कर सकते हैं

import play.api.libs.json._
import play.api.libs.json.Reads._
import play.api.libs.functional.syntax._
import play.modules.reactivemongo.json.BSONFormats._
import reactivemongo.bson.BSONObjectID

def copyKey(fromPath: JsPath,toPath:JsPath ) = __.json.update(toPath.json.copyFrom(fromPath.json.pick))

val json = """{
  "id": "ff59ab34cc59ff59ab34cc59",
  "name": "Joe",
  "surname": "Cocker"
}"""

val originaljson = Json.parse(json)
val publicIdPath: JsPath = JsPath \ 'id
val privateIdPath: JsPath = JsPath \ '_id \ '$oid

val _personReads: Reads[(BSONObjectID,String,String)] = (
  (__ \ '_id).read[BSONObjectID] ~
  (__ \ 'name).read[String] ~
  (__ \ 'surname).read[String]
).tupled
val personReads=_personReads.compose(copyKey(publicIdPath,privateIdPath))

originaljson.validate(personReads)
// yields res5: play.api.libs.json.JsResult[(reactivemongo.bson.BSONObjectID, String, String)] = JsSuccess((BSONObjectID("ff59ab34cc59ff59ab34cc59"),Joe,Cocker),/id)

या आपका मतलब था कि आप आईडी कुंजी के मान को _id \ $oid . पर ले जाना चाहते हैं जिसे

. के साथ पूरा किया जा सकता है
import play.api.libs.json._
import play.api.libs.json.Reads._
import play.api.libs.functional.syntax._
import play.modules.reactivemongo.json.BSONFormats._
import reactivemongo.bson.BSONObjectID

def copyKey(fromPath: JsPath,toPath:JsPath ) = __.json.update(toPath.json.copyFrom(fromPath.json.pick))

val json = """{
  "id": "ff59ab34cc59ff59ab34cc59",
  "name": "Joe",
  "surname": "Cocker"
}"""

val originaljson = Json.parse(json)
val publicIdPath: JsPath = JsPath \ 'id
val privateIdPath: JsPath = JsPath \ '_id \ '$oid

originaljson.transform(copyKey(publicIdPath,privateIdPath) andThen publicIdPath.json.prune)

आपके पास अभी के लिए BSONObjectID नहीं हो सकता है क्योंकि आप JsValue प्रकार पदानुक्रम से ऑब्जेक्ट में हेरफेर कर रहे हैं। जब आप जेसन को प्रतिक्रियाशीलमोंगो में पास करते हैं तो इसे बीएसओएनवेल्यू में परिवर्तित कर दिया जाता है। एक JsObject को BSONDocument में बदल दिया जाएगा। यदि JsObject में _id\$oid . के लिए पथ है यह पथ स्वचालित रूप से एक BSONObjectId में परिवर्तित हो जाएगा और इसे mongodb में ऑब्जेक्ट आईडी के रूप में संग्रहीत किया जाएगा।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. स्प्रिंग मोंगो टेम्पलेट। भू क्वेरी में क्रमित काम नहीं कर रहा है (नियरक्वेरी)

  2. MongoDB में सरणी फ़ील्ड में दिए गए तत्व का सूचकांक प्राप्त करें

  3. रेडिस कब? मोंगोडीबी कब?

  4. मोंगो आँकड़े () फ़ंक्शन द्वारा प्रदर्शित आकार और भंडारण आकार के बीच क्या अंतर है

  5. त्रुटि संदेश:MongoError:खराब प्रमाणीकरण URI स्ट्रिंग के माध्यम से विफल रहा