2013-11-28 5 views
0

Я пытаюсь выполнить эту задачу на Java, используя mongodb. Предположим, у меня есть список сотрудников (имя, фамилия, номер телефона). Теперь некоторые сотрудники могут иметь более одного номера телефона.Mongodb - добавить к дублированной записи

Скажем, у меня есть список сотрудников (я разбора документа 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" ] } 

Что я имею try сначала начинается с анализа документа и вставки имени и имени. Затем, запрашивая для FirstName и LastName, если она существует, то обновление записи с помощью $ толчка, чтобы добавить номер телефона:

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" } 

Так что, в общем, есть одна запись Джона Смита без номера телефона, который добавляется, почему? Также почему мои первые две записи отображают последнее имя?

Я довольно новичок в mongodb, поэтому это очень неряшливый и быстрый код, чтобы увидеть, как я могу выполнить эту задачу.

Я с радостью признателен вам за любую помощь.

Спасибо.

ответ

0

Mongodb имеет концепцию upsert (вставить, если не существует или обновление, если оно существует).

Попробуйте использовать: update(DBObject q,DBObject o, boolean upsert, boolean multi) с флагом upsert, установленным в true.

Что-то вроде этого:

collection.update (новый BasicDBObject ("имя", "Джон") добавить ("LastName", "Smith"), новый BasicDBObject ("$ толчок", новый BasicDBObject (. «телефон», «новый номер»)), true, false)

+0

Вау, я излишне усложнил свою жизнь. Я знал о команде upsert, но просто не знал, как правильно ее реализовать :-) Спасибо за это, это сработало как шарм! – Alistair