如何解决正确的数据结构用于存储对象数组
我想为用户存储纬度和经度坐标。它们可能不止一个,所以我将其制成一组对象。我只是想问一下这种结构是否可以为用户存储对象数组,还是应该将其更改为其他/更好的东西?
在我的用户猫鼬模式中:
```{r,echo=FALSE}
instructorVersion <- TRUE
```
What is 1+1?
```{asis,echo=instructorVersion}
::: {.ANSWER data-latex=""}
1. This answer is easy
2. Yes,really,that's all that I was asking.
:::
```
What is the meaning of life?
```{asis,echo=instructorVersion}
::: {.ANSWER data-latex=""}
The Answer is only for Instructor's Eyes
1. The answer is hard
2. You won't get it right
3. But try anyway
:::
```
我的控制器:
places: [
{
location: {
latitude: {
type: Number,},longitude: {
type: Number,],
当我查看Mongo DB Atlas时,我可以看到数组中的每个对象都有自己的_id。
exports.addLocation = async (req,res) => {
const { latitude,longitude,userId } = req.body;
const user = await User.findById(userId);
if (!user) {
return res.status(404).send("No user found");
}
user.places.push({ location: { longitude: longitude,latitude: latitude } });
await user.save();
res.status(201).send(user);
};
解决方法
两个选项均取决于您的用例。在任何NoSQL建模中,数据都会决定将重复数据嵌入同一文档还是拆分为更多文档更好。
例如,如果您要跟踪用户,并且“地点”数组将存储用户停留时间超过10分钟的目的地,那么您的数组可能会不断增长,超出最大文档大小16MB。
即使比zise小得多,用数百个元素查询数组也将成为噩梦。
对于这种用例,最好将这些访问分成单独的文档。例如在“电子邮件”之后添加“天”,并将每天的位置存储在单独的文档中,其中每个数组元素是当天访问的另一个目标。
但是,如果不希望“ places”数组增长,则将其嵌入在一个单用户文档中,就像您的示例一样。
以下是我们有的问题
- 我们是否需要将
places
存储在数组中,只要它应为NoSQL
方法? - NoSql数据库不必不必规范化数据库并创建需要多个联接等的表。
使用当前数据,归一化方法将如下所示:
对于归一化方法,我们不想有任何重复并且有多对多的关系。在这种情况下,它不适用于NoSQL数据库。
这是另一个将地点分隔到另一个集合的示例,但更多使用适合NoSQL的方法
注意: 表视图中提供了MongoDB的示例,作为展示。确保它应该是JSON格式
Json结构
用户集合:
{
"_id" : ObjectId("5f0b0540c0c721d9f87ded50"),"name":"Bob","email": "bob@gmail.com"
}
地点集合:
[{
"_id": ObjectId("5f3577d511d3f56b7082d320")
"location": {
"longitude": 48.137565,"latitude": 11.575502
},"saved_at": "2020-08-13T17:26:45.312Z","user_id": ObjectId("5f0b0540c0c721d9f87ded50")
},{
"_id": ObjectId("5f3577d5098gh56b7082d410")
"location": {
"longitude": 43.137565,"latitude": 12.575502
},"saved_at": "2020-08-13T19:26:45.312Z","user_id": ObjectId("5f0b0540c0c721d9f87ded50")
}]
正如您在这里看到的,我们将进行数据复制,而在NoSQL世界中,我们将不在乎。我们选择将这两个集合分开,以增加和简化对数据库的查询。
总结一下-在这种情况下,我们不使用SQL规范化。我们正在分离数据,复制数据,因此很容易查询,设置多个索引(如果需要),更新和删除文档等。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。