【发布时间】:2013-11-29 13:41:17
【问题描述】:
我正在尝试使用 mongodb 在 Java 中完成此任务。假设我有一个员工列表(名字、姓氏、电话号码)。现在,一些员工可以拥有多个电话号码。
假设我有一个员工列表(我正在解析一个 xml 文档):
<contact><firstname>John</firstname><lastname>Smith</lastname><phonenum>555 123 23 23</phonenum></contact>
<contact><firstname>Jane</firstname><lastname>Doe</lastname><phonenum>555 123 44 44</phonenum></contact>
<contact><firstname>John</firstname><lastname>Smith</lastname><phonenum>555 666 66 66 23</phonenum></contact>
在 mongodb 中生成的插入应该如下所示:
{ "_id" : ObjectId("5297a3d84a9cb457a3f33b23"), "name" : "John", "lastName" : "Smith", "phone" : [ "555 123 23 23", "555 666 66 66 23" ] }
{ "_id" : ObjectId("5297a3d84a9cb457a3f33b24"), "name" : "Jane", "lastName" : "Doe", "phone" : [ "555 123 44 44" ] }
我首先尝试的是解析文档并插入名字和姓氏。然后,查询名字和姓氏,如果存在,则使用 $push 附加电话号码来更新记录:
File fXmlFile = new File("contacts.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder;
Document doc;
try {
MongoClient mongo = new MongoClient("localhost", 27017);
DB db = mongo.getDB("testdb");
dBuilder = dbFactory.newDocumentBuilder();
DBCollection table = db.getCollection("employees");
doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
NodeList nList = doc.getElementsByTagName("contact");
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
BasicDBObject document = new BasicDBObject();
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
String firstName = eElement.getElementsByTagName("name").item(0).getTextContent();
String lastName =eElement.getElementsByTagName("lastName").item(0).getTextContent();
document.put("name", firstName);
document.put("lastName", lastName);
table.insert(document);
String phoneNumber = eElement.getElementsByTagName("phone").item(0).getTextContent();
BasicDBObject query = new BasicDBObject();
query.put("name", firstName);
query.put("lastName", lastName);
BasicDBObject push = new BasicDBObject();
push.put("$push", new BasicDBObject("phone",phoneNumber));
table.update(query, push);
}
}
但我得到以下结果:
{ "_id" : ObjectId("5297a5004a9ca519fad4e94d"), "lastName" : "Smith", "name" : "John", "phone" : [ "555 123 23 23"
, "555 666 66 66 23" ] }
{ "_id" : ObjectId("5297a5004a9ca519fad4e94e"), "lastName" : "Doe", "name" : "Jane", "phone" : [ "555 123 44 44" ]
}
{ "_id" : ObjectId("5297a5004a9ca519fad4e94f"), "name" : "John", "lastName" : "Smith" }
所以基本上,有一条 John Smith 记录没有添加电话号码,这是为什么呢?另外为什么我的前两条记录首先显示姓氏?
我是 mongodb 的新手,所以这是非常草率和快速的代码,只是为了看看我如何完成这项任务。
如果有任何帮助,我将不胜感激。
谢谢。
【问题讨论】:
标签: mongodb mongo-java