Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb-在重复记录上追加_Mongodb_Mongo Java - Fatal编程技术网

Mongodb-在重复记录上追加

Mongodb-在重复记录上追加,mongodb,mongo-java,Mongodb,Mongo Java,我正试图使用mongodb在Java中完成这项任务。假设我有一份员工名单(名字、姓氏、电话号码)。现在,一些员工可以有多个电话号码 假设我有一个员工列表(我正在解析一个xml文档): 我尝试的是首先解析文档并插入firstname和lastname。然后,查询firstname和lastname(如果存在),使用$push追加电话号码来更新记录: File fXmlFile = new File("contacts.xml"); DocumentBuilderFactory dbFactory

我正试图使用mongodb在Java中完成这项任务。假设我有一份员工名单(名字、姓氏、电话号码)。现在,一些员工可以有多个电话号码

假设我有一个员工列表(我正在解析一个xml文档):

我尝试的是首先解析文档并插入firstname和lastname。然后,查询firstname和lastname(如果存在),使用$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);
}
所以基本上,有一张约翰·史密斯的唱片,没有添加电话号码,为什么?为什么我的前两条记录显示为lastname first

我是mongodb的新手,所以这是一段非常草率和快速的代码,只是为了看看如何完成这项任务

我将非常感谢任何帮助


谢谢。

Mongodb的概念是(如果不存在则插入,如果存在则更新)

尝试使用:将upsert标志设置为true

大概是这样的:

{ "_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" ] }

收藏。更新(新BasicDBObject(“姓名”、“约翰”)。追加(“姓氏”、“史密斯”)、新BasicDBObject(“推送”)、新BasicDBObject(“电话”、“新号码”)、真、假)

哇,我的生活不必要地复杂化了。我知道upsert命令,但只是不知道如何正确地执行:-)谢谢你,它工作起来很有魅力!
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" }