查询返回null - 使用Mongo的Java驱动程序

时间:2014-01-04 03:23:53

标签: mongodb morphia

我正在尝试通过查询集合的ID来更新集合,但由于某种原因,我根本无法更新集合。我做错了什么?

        DBCollection collection  = db.getCollection("sv_office_src");

        for(OutputSet o : outputData) {
            BasicDBObject searchOfficeQuery = new BasicDBObject();
            searchOfficeQuery.append("_id", o.getId());
            //collection.findOne(searchOfficeQuery);

            System.out.println(searchOfficeQuery);

            BasicDBObject newUpdateDocument = new BasicDBObject();
            newUpdateDocument.append("target_key", o.getTarget_key());
            newUpdateDocument.append("target_office_id", o.getTarget_office_id());
            newUpdateDocument.append("target_firm_id", o.getTarget_firm_id());
            newUpdateDocument.append("score", o.getScore());

            BasicDBObject updatedDocument = new BasicDBObject();
            updatedDocument.append("$set", newUpdateDocument);

            collection.update(searchOfficeQuery, updatedDocument);

            System.out.println("Output : " + updatedDocument);              
        }               

,输出如下:

{ "_id" : "52c6f6d5250c7ef0f654c7dd"}

输出:

{ "$set" : { "target_key" : "440786|PO BOX 15007|||WILMINGTON|US-NC|28408-5007|US" , "target_office_id" : "503677" , "target_firm_id" : "87277" , "score" : "17"}}

所以我得到了正确的文档,但是当我执行以下操作时,在mongo shell中,您会看到更新的列是空白的。 我知道上述内容的密钥Firm_Name

> db.sv_office_src.find ({Firm_Name: "1717 Capital Management Company"})
{ "_id" : ObjectId("52c77b8d250ca11d792200aa"), "Firm_Name" : "1717 Capital Management Company", "Firm_Id" : "6715", "Office_Id" : "200968", "Office_Address_Line_1" : "PO BOX 15626", "Office_Address_Line_2"
: "", "Office_Address_Line_3" : "", "Office_City" : "WILMINGTON", "Office_Region_Ref_Code" : "US-DE", "Office_Postal_Code" : "19850-5626", "Office_Country_Ref_Code" : "US", "src_key" : "200968|PO BOX 15626||
|WILMINGTON|US-DE|19850-5626|US", "target_key" : "", "target_office_id" : "", "target_firm_id" : "", "target_firm_name" : "", "score" : "" }

2 个答案:

答案 0 :(得分:1)

这两个文件的ID不一样:

{ "_id" : "52c6f6d5250c7ef0f654c7dd"}

VS

{ "_id" : ObjectId("52c77b8d250ca11d792200aa") <snip/>

这里有两个问题。十六进制值是不同的,第一个的类型看起来是“字符串”,如果第二个是ObjectId,则类型。

如果您的OutputSet.getId()方法返回十六进制字符串,那么您可以通过将其传递给构造函数将其转换为ObjectId(http://api.mongodb.org/java/current/org/bson/types/ObjectId.html):

searchOfficeQuery.append("_id", new ObjectId( o.getId() ) );

您还可以从update命令检查WriteResult(http://api.mongodb.org/java/current/com/mongodb/WriteResult.html),以查看每次更新更新的文档数。查看WriteResult.getN()方法。在这种情况下,如果它找到文档并更新它,我希望它为1,如果找不到文档则为零。

HTH, 罗布。

答案 1 :(得分:0)

您的searchOfficeQuery中的_id和您的Firm_Name查询中的“证明”中的_id不匹配。你可以试试

db.sv_office_src.find({ "_id" : ObjectId("52c6f6d5250c7ef0f654c7dd")})

查看您实际上$set所有这些字段的文档。