【问题标题】:Mongodb - append on duplicate recordMongodb - 在重复记录上追加
【发布时间】: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


    【解决方案1】:

    Mongodb 有upsert 的概念(不存在则插入,存在则更新)。

    尝试使用:update(DBObject q,DBObject o, boolean upsert, boolean multi),并将 upsert 标志设置为 true。

    类似这样的:

    collection.update(new BasicDBObject("name", "John").append("lastName", "Smith"), new BasicDBObject("$push", new BasicDBObject("phone", "new number") ), 真, 假)

    【讨论】:

    • 哇,我的生活不必要地复杂化了。我知道 upsert 命令,但只是不知道如何正确实现它:-) 谢谢你,它就像一个魅力!
    猜你喜欢
    • 2019-08-08
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 2015-01-15
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    相关资源
    最近更新 更多