合并列具有相同值的文档并使用找到的数据创建字段
Merge documents where a column has the same value and create fields with found data
如何将同一用户的文档合并在一起?
我觉得很难做的是自动将 "field" 列的值添加为列,并将 "data" 字段的数据自动添加为新创建的列的值。
喜欢合并这两个,因为它们具有相同的用户 ID 并且具有列 "Date of birth":"1989-01-12" 和 "Job":"Teacher".
我知道要问的问题很多,但有人可以指导我如何实现吗?
{
"_id" : ObjectId("5d6b00b960016c4c441d9a16"),
"user" : 1000,
"field" : "Date of birth",
"data" : "1989-01-12",
"timestamp" : "2017-08-27 11:00:59"
}
{
"_id" : ObjectId("5d6b00b960016c4c441d9a17"),
"user" : 1000,
"field" : "Job",
"data" : "Teacher",
"timestamp" : "2017-08-27 10:59:19"
}
进入
{
"_id" : ObjectId("5d6b00b960016c4c441d9a16"),
"user" : 1000,
"Date of birth" : "1989-01-12",
"Job" : "Teacher",
"timestamp" : "2017-08-27 11:00:59"
}
要合并文档,您可以迭代它们以创建新文档。
如果您想删除对给定用户的旧引用,则必须在插入新文档之前删除它们。
您可以使用 MongoDB 的 javascript 界面:
// Get the docs
docs = db.find({user:1000})
// Init common values of the new doc
new_doc = db.findOne({user:1000})
// Remove the unused field in the new object
delete new_doc.field
delete new_doc.data
for (i=0; i<docs.size(); i++){
doc = docs[i]
new_doc[doc["field"]] = new_doc["data"]
if (Date(doc["timestamp"]) > Date(new_doc["timestamp"])) {
new_doc["timestamp"] = doc["timestamp"]
}
}
// remove all references to the user if you need to
db.remove({user:1000}, {multi:true})
// insert the merged document
db.insert(new_doc)
如何将同一用户的文档合并在一起?
我觉得很难做的是自动将 "field" 列的值添加为列,并将 "data" 字段的数据自动添加为新创建的列的值。
喜欢合并这两个,因为它们具有相同的用户 ID 并且具有列 "Date of birth":"1989-01-12" 和 "Job":"Teacher".
我知道要问的问题很多,但有人可以指导我如何实现吗?
{
"_id" : ObjectId("5d6b00b960016c4c441d9a16"),
"user" : 1000,
"field" : "Date of birth",
"data" : "1989-01-12",
"timestamp" : "2017-08-27 11:00:59"
}
{
"_id" : ObjectId("5d6b00b960016c4c441d9a17"),
"user" : 1000,
"field" : "Job",
"data" : "Teacher",
"timestamp" : "2017-08-27 10:59:19"
}
进入
{
"_id" : ObjectId("5d6b00b960016c4c441d9a16"),
"user" : 1000,
"Date of birth" : "1989-01-12",
"Job" : "Teacher",
"timestamp" : "2017-08-27 11:00:59"
}
要合并文档,您可以迭代它们以创建新文档。 如果您想删除对给定用户的旧引用,则必须在插入新文档之前删除它们。
您可以使用 MongoDB 的 javascript 界面:
// Get the docs
docs = db.find({user:1000})
// Init common values of the new doc
new_doc = db.findOne({user:1000})
// Remove the unused field in the new object
delete new_doc.field
delete new_doc.data
for (i=0; i<docs.size(); i++){
doc = docs[i]
new_doc[doc["field"]] = new_doc["data"]
if (Date(doc["timestamp"]) > Date(new_doc["timestamp"])) {
new_doc["timestamp"] = doc["timestamp"]
}
}
// remove all references to the user if you need to
db.remove({user:1000}, {multi:true})
// insert the merged document
db.insert(new_doc)