gpt4 book ai didi

javascript - MongoDB 双重插入和推送

转载 作者:行者123 更新时间:2023-12-02 16:10:03 25 4
gpt4 key购买 nike

我在 Mongo 中有以下数据结构:

{
"_id": "L7ucxMsTSfTDtctnt",
"lectures": [
{
"_id": "Tfr3DMxavZwP5yy6F",
"notes": [
{
"slide": 1,
"notes": "First Note",
"timestamp": "2015-05-18T20:18:36.510Z"
},
{
"slide": 2,
"notes": "Another note",
"timestamp": "2015-05-18T20:18:36.510Z"
}
]
}
]
}

我正在尝试进行三次更新插入和数组推送。因此,如果外部 _id 不存在,则创建它,否则更新它。如果讲座_id不存在,则创建它,否则更新它。如果notes _id不存在,则创建对象并推送到notes数组,否则更新它。

有可能做这么复杂的事情吗?我可以通过三个单独的步骤来完成此操作,但我经常调用该函数并且担心性能。

最佳答案

如果您可以通过 3 个步骤完成此操作,那将非常令人印象深刻...哎呀,只是试图编写一个查询来返回具有该模式的单个注释对象,这让我很伤脑筋。 (尝试一下,你不会喜欢的)。

第二层之后,mongo 中的对象模式数组开始变得非常麻烦。通常最好使用新集合或将其存储为子文档(doc.lectures['alsfjljfldjf5084534']),因为这样您就有了一个内存地址可以引用,而不是绞尽脑汁尝试执行嵌套$elemmatch

无论如何,为了回答你的问题,这只是 1 个更新插入,因为它只有 1 个文档。当你想到整个事情只有 1 个文档时,你就更容易理解了。只需获取文档并将其保存为 JS 对象即可。修改对象然后更新插入整个对象。不必担心传输几个额外字节的重复数据。用疯狂的迭代查询来困扰你的数据库,以找到你想要编辑的文档中的特定点,这更加费力。

在这种特殊情况下,您已经正确建模了 ER(1 个类(class)有很多讲座,1 个讲座有很多笔记),但是,根据您的查询模式,您可能希望将类(class)放入自己的集合中并包括classID 作为您的讲座集合中的 FK。然后,可以选择将注释设为子文档以便于访问。

这样做,获取注释对象就像以下一样简单:Lectures.findOne({notesID: '234asfj'})。当然,你会失去原子性,但这是一个很小的代价。

编辑:

doc = {}; //empty object
subDocId = Random.id(); //ref for subdoc
doc[subDocId] = {
notes: 1,
text: 'foo'
}; // create subdoc
Lecture.insert(doc); //insert subdoc

var doc = Lectures.findOne(); //get it
doc["Tfr3DMxavZwP5yy6F"] = {foo:1, bar:2} //mod it
Lecture.insert(doc); //upload it

关于javascript - MongoDB 双重插入和推送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30312739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com