mongodb - MongoDB 在文档中插入数组字段或简单地使用对象
问题描述
例如,我们有一些人,每个人都是这样的。
{name : 'john'}
现在我想添加一个名为 Girlsfriends 的数组字段,比如
{name : 'john', girlfriends: ['Stacy']}
这一般是怎么做的?在应用程序代码中分两步执行吗?
- 检查文档
girlfriends
上是否存在字段person
? 一种。如果不存在:$set person
girlsfriends
to ['Stacy']湾。如果存在:将元素推送到数组?
所以要么这样做,要么只是[]
在每个文档创建时初始化数组字段?或者有些只是使用对象?生成一个随机 ID 作为密钥?
使用数组而不是对象有好处吗?查询好像挺麻烦的。。
编辑: 好吧,没关系。我应该尝试 $push 方法。对于遇到的任何人来说,MongoDB 文档在说的时候有点模棱两可
如果该字段不是数组,则操作将失败。
如果该字段不存在,它将为您创建它... ofc 它会.. 它的 mongo ..
解决方案
您可以在更新查询中直接使用$push
or运算符。$addToSet
如果数组不存在,它将由这些运算符创建。将$addToSet
只保留数组中的唯一元素,因此您无需检查它是否已经在数组中。
这是完整的查询:
db.<your_collection>.updateOne({name:'John'},{$addToSet:{girlfriends:'Stacy'}})
证明:
> db.toto.insertOne({name:"John"})
{
"acknowledged" : true,
"insertedId" : ObjectId("5d2f325cf1789f14256be87a")
}
> db.toto.find()
{ "_id" : ObjectId("5d2f325cf1789f14256be87a"), "name" : "John" }
> db.toto.updateOne({name:"John"},{$addToSet:{girlfriends:"Stacy"}})
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
> db.toto.find()
{ "_id" : ObjectId("5d2f325cf1789f14256be87a"), "name" : "John", "girlfriends" : [ "Stacy" ] }
使用数组而不是对象有好处吗?
嗯,这是一个很长的话题。但长话短说,只有在 Map 的情况下,您可能会想使用对象而不是数组。例如:
"map": {
"id1": "value1",
"id2": "value2",
"id3": "value3"
}
我绝对建议不要使用这种结构,因为它很难维护和索引。相反,我建议使用这种结构:
"map": [
{ key:"id1", value: "value1" },
{ key:"id2", value: "value2" },
{ key:"id3", value: "value3" }
]
然后,您可以分别索引每个字段。
推荐阅读
- java - 在哪里放置 REST 保证测试
- angularjs - Angular中的动态构建菜单
- mysql - 有没有办法在 MySql 中获取计数值的输出?
- javascript - 在firebase auth中将用户设为null
- swift - apple-app-site-association 文件是否适用于 GitHub Pages(即 site.github.io)?
- reactjs - 为什么我的日历小部件不允许我选择原始开始日之后的天数?
- python - turtle.Screen().screensize() 没有输出正确的屏幕尺寸
- c++ - 将地址分配给本地指针后,公共对象的变量消失
- javascript - Redux reducer 不显示我的控制台日志并返回 undefined
- php - 如何从 XML 中隐藏特定元素?