我正在尝试通过查询集合的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" : "" }
答案 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
所有这些字段的文档。