mongo-scala某字段有则更新无则插入

问题:
SparkStreaming处理实时数据将统计结果写入mongo,用mongo-java的api需要做一层判断即对某个维度进行查找如果存在则把指标更新,如果不存在则插入维度与指标字段,这种方式耗时效率低下
换用mongo-scala的api使用其upsert方式实现插入与跟新,需要query的字段需在mongo中建立索引

/**
   * Performs an update operation.
   * @param q search query for old object to update
   * @param o object with which to update `q`
   */
  def update[A, B](q: A, o: B, upsert: Boolean = false, multi: Boolean = false,
                   concern:                  com.mongodb.WriteConcern = this.writeConcern,
                   bypassDocumentValidation: Option[Boolean]          = None)(implicit queryView: A => DBObject, objView: B => DBObject,
                                                                              encoder: DBEncoder = customEncoderFactory.map(_.create).orNull): WriteResult = {
    bypassDocumentValidation match {
      case None                   => underlying.update(queryView(q), objView(o), upsert, multi, concern, encoder)
      case Some(bypassValidation) => underlying.update(queryView(q), objView(o), upsert, multi, concern, bypassValidation, encoder)
    }
  }

添加依赖:


    <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>casbah_2.11</artifactId>
            <version>3.1.1</version>
            <type>pom</type>
        </dependency>
        
         <dependency>
            <groupId>org.mongodb.spark</groupId>
            <artifactId>mongo-spark-connector_2.11</artifactId>
            <version>${spark.version}</version>
        </dependency>
        

注:pom中和需要去掉java-mongo-driver的依赖,否则冲突

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值