首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gmongo的副本也不例外

gmongo的副本也不例外
EN

Stack Overflow用户
提问于 2013-08-08 21:59:12
回答 3查看 377关注 0票数 2

我尝试用Groovy和Java将副本插入到mongodb数据库中。Java会引发一个异常,而groovy版本只是悄悄地忽略插入复制。

下面是一些说明这一点的示例代码。我正在运行OsX,Mongodb版本2.4.4。有人能给我一点启发吗?非常感激!

代码语言:javascript
复制
package chapter3

import com.gmongo.GMongo
import com.mongodb.BasicDBObject
import com.mongodb.DB
import com.mongodb.DBCollection
import com.mongodb.MongoClient

class TweetArchiveWithJava {
    static void main(String[] args) {
        new TweetArchiveWithJava()
    }

    private static final int ASCENDING = 1

    TweetArchiveWithJava() {
        duplicateInsertGroovy()
        duplicateInsertJava()
    }

    def duplicateInsertJava() {
        println "Inserting duplicates with Java"
        MongoClient mongoClient = new MongoClient()
        DB db = mongoClient.getDB("twitter-archive")
        DBCollection tweets = db.getCollection("tweets")

        tweets.remove(new BasicDBObject())
        tweets.ensureIndex(new BasicDBObject("last_name", ASCENDING), "unique_index", true)

        BasicDBObject insertedRecord = new BasicDBObject("last_name", "jones")
        BasicDBObject duplicate = new BasicDBObject("last_name", "jones")
        tweets.insert(insertedRecord)
        System.out.println("Inserted first one")
        printAllTweets(tweets)
        tweets.insert(duplicate)
        System.out.println("What?!! Should not be able to insert duplicates.")

        printAllTweets(db)
    }

    private void duplicateInsertGroovy() {
        println "Inserting duplicates with Groovy"
        def mongo = new GMongo("127.0.0.1", 27017)
        def db = mongo.getDB("twitter-archive")
        DBCollection tweets = db.getCollection("tweets")

        tweets.remove([:])
        tweets.ensureIndex(new BasicDBObject("last_name", ASCENDING), "unique_index", true)

        def jones = [last_name: "jones"]
        tweets.insert(jones)
        println "Inserted first Jones"
        def duplicate = [last_name: "jones"]
        tweets.insert(duplicate)
        println "Succeeded inserting duplicate"

        println "But only one record is found"
        printAllTweets(tweets)
        println "\n"
    }

    def printAllTweets(tweets) {
        def cursor = tweets.find()
        cursor.each { println it }
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-09 09:55:50

首先,您可以使用WriteResult进行错误指示:

代码语言:javascript
复制
def jones = [last_name: "jones"]
WriteResult rs =  tweets.insert(jones)
println rs.error
//println "Inserted first Jones"
def duplicate = [last_name: "jones"]
rs = tweets.insert(duplicate)
//println "Succeeded inserting duplicate"
println rs.error

指纹:

代码语言:javascript
复制
null
E11000 duplicate key error index: twitter.tweets.$unique_index  dup key: { : "jones" }

造成这种差异的原因是WriteConcern

java方法代码使用{w=1} (已确认)

而groovy方法代码使用{w=0} (普通)。

表格DBTCPConnector

代码语言:javascript
复制
        if ( concern.callGetLastError() ){
            return _checkWriteError( db , port , concern );
        }
        else {
            return new WriteResult( db , port , concern );
        }

WriteConcern中:

代码语言:javascript
复制
 public boolean callGetLastError(){
    if (_w instanceof Integer)
        return (Integer) _w  > 0;
    return _w != null;
 }

因此,java方法在后台调用_checkWriteError (抛出异常),而groovy方法只返回写结果。

您有不同的写关注点的原因是初始化代码:

在java方法中初始化MongoClient mongoClient = new MongoClient(),该方法在内部使用WriteConcern.ACKNOWLEDGED

在groovy方法中,GMongo构造函数使用内部使用WriteConcern.NORMALMongo废弃构造函数。

如果将tweets.insert(duplicate)更改为tweets.insert(duplicate, WriteConcern.ACKNOWLEDGED),也会得到groovy方法的异常

票数 2
EN

Stack Overflow用户

发布于 2013-08-08 22:08:17

不确定,但是如果将groovy版本更改为:

代码语言:javascript
复制
    def jones = [last_name: "jones"] as BasicDBObject
    tweets.insert(jones)
    println "Inserted first Jones"
    def duplicate = [last_name: "jones"] as BasicDBObject
    tweets.insert(duplicate)
票数 0
EN

Stack Overflow用户

发布于 2013-08-13 18:35:24

您也可以使用com.gmongo.GMongoClient。它具有与com.mongodb.MongoClient相同的构造函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18136877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档