Я пытаюсь выполнить эту задачу на 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, поэтому это очень неряшливый и быстрый код, чтобы увидеть, как я могу выполнить эту задачу.
Я с радостью признателен вам за любую помощь.
Спасибо.
Вау, я излишне усложнил свою жизнь. Я знал о команде upsert, но просто не знал, как правильно ее реализовать :-) Спасибо за это, это сработало как шарм! – Alistair