Mongodb 合并列具有相同值的文档,并使用找到的数据创建字段

Mongodb 合并列具有相同值的文档,并使用找到的数据创建字段,mongodb,merge,mongodb-query,document,Mongodb,Merge,Mongodb Query,Document,如果用户相同,如何将文档合并在一起 我发现很难做到的是自动将“field”列中的值添加为列,将“data”字段中的数据添加为新创建列的值 喜欢合并这两个,因为它们具有相同的用户id,并且有“出生日期”:“1989-01-12”和“工作”:“教师”列 我知道这是一个很大的要求,但有人可以指导我如何实现这一点吗 { "_id" : ObjectId("5d6b00b960016c4c441d9a16"), "user" : 1000, "field" : "Date of b

如果用户相同,如何将文档合并在一起

我发现很难做到的是自动将“field”列中的值添加为列,将“data”字段中的数据添加为新创建列的值

喜欢合并这两个,因为它们具有相同的用户id,并且有“出生日期”:“1989-01-12”和“工作”:“教师”列

我知道这是一个很大的要求,但有人可以指导我如何实现这一点吗

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


要合并文档,可以迭代它们以创建新文档。 如果要删除对给定用户的旧引用,则必须在插入新文档之前删除它们

您可以使用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)

//获取文档
docs=db.find({user:1000})
//初始化新文档的公共值
new_doc=db.findOne({user:1000})
//删除新对象中未使用的字段
删除新文档字段
删除新的文档数据
对于(i=0;i日期(新文档[“时间戳])){
新文档[“时间戳”]=文档[“时间戳”]
}
}
//如果需要,请删除对用户的所有引用
db.remove({user:1000},{multi:true})
//插入合并的文档
db.插入(新文档)

我强烈建议您不要这样做,因为您可能正在挑选一个项目,其中原作者对您认为好的内容有更好的想法。您确实希望在此处使用单独的文档,并且不使用命名字段。最好的建议是将此作为一种学习经验,并保持数据不变。很好。最好花点时间来理解原著作者为什么这样做。我也强烈地认为,原著作者在这里的意图显然是事务性的,因为每个条目都有自己的时间戳。您的更改建议将破坏交易历史。我还建议您深入研究数据集,因为您可能会发现很多东西都没有常用的命名字段。因此,为什么要使用一致的名称,例如
字段
数据
,我们可以很容易地做到这一点,但在此之前,我很想知道为什么要以这种方式插入数据?数据来源是否有多个?时间戳的意义是什么?
// 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)