MongoDB 在文档中更新数组字段或简单地使用对象
MongoDB upsert an array field in a document or simply use objects
例如,我们收集了一些人,每个人都是这样。
{name : 'john'}
现在我想添加一个名为girlsfriends的数组字段,所以喜欢
{name : 'john', girlfriends: ['Stacy']}
这通常是如何完成的?在应用程序代码中分两步完成?
- 检查
person
文档中是否存在 girlfriends
字段?
一个。如果不存在:$set person girlsfriends
to ['Stacy']
b。如果存在:将元素推送到数组?
所以要么这样做要么
只需在每次创建文档时将数组字段初始化为 []
?或者有些只是使用对象?生成一个随机 ID 作为密钥?
使用数组而不是对象有好处吗?似乎查询很麻烦..
编辑:
好吧没关系。我应该只是尝试了 $push 方法。对于遇到的任何人来说,MongoDB 文档说
时有点含糊不清
If the field is not an array, the operation will fail.
如果该字段不存在,它会为您创建...当然会..它的mongo..
没有。这可以一步完成。参考 $push
db.collectionName.update({'name' : 'John'}, {"$push" : {"gf" : "Stacy"}});
db.collectionName.update({'name' : 'John'}, {"$push" : {"gf" : "Nikki"}});
如果数组字段不存在,它将创建一个,否则,附加到它。
您可以在更新查询中直接使用 $push
或 $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" ] }
Is there benefit to use array over object?
好吧,这是一个很长的话题。但长话短说,您唯一可能想要使用对象而不是数组的情况是在 Map 的情况下。例如:
"map": {
"id1": "value1",
"id2": "value2",
"id3": "value3"
}
我肯定会建议 不要 使用这个结构,因为它真的很难维护和索引。
相反,我建议使用这种结构:
"map": [
{ key:"id1", value: "value1" },
{ key:"id2", value: "value2" },
{ key:"id3", value: "value3" }
]
然后您可以分别为每个字段编制索引。
例如,我们收集了一些人,每个人都是这样。
{name : 'john'}
现在我想添加一个名为girlsfriends的数组字段,所以喜欢
{name : 'john', girlfriends: ['Stacy']}
这通常是如何完成的?在应用程序代码中分两步完成?
- 检查
person
文档中是否存在girlfriends
字段? 一个。如果不存在:$set person
girlsfriends
to ['Stacy']b。如果存在:将元素推送到数组?
所以要么这样做要么
只需在每次创建文档时将数组字段初始化为 []
?或者有些只是使用对象?生成一个随机 ID 作为密钥?
使用数组而不是对象有好处吗?似乎查询很麻烦..
编辑: 好吧没关系。我应该只是尝试了 $push 方法。对于遇到的任何人来说,MongoDB 文档说
时有点含糊不清If the field is not an array, the operation will fail.
如果该字段不存在,它会为您创建...当然会..它的mongo..
没有。这可以一步完成。参考 $push
db.collectionName.update({'name' : 'John'}, {"$push" : {"gf" : "Stacy"}});
db.collectionName.update({'name' : 'John'}, {"$push" : {"gf" : "Nikki"}});
如果数组字段不存在,它将创建一个,否则,附加到它。
您可以在更新查询中直接使用 $push
或 $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" ] }
Is there benefit to use array over object?
好吧,这是一个很长的话题。但长话短说,您唯一可能想要使用对象而不是数组的情况是在 Map 的情况下。例如:
"map": {
"id1": "value1",
"id2": "value2",
"id3": "value3"
}
我肯定会建议 不要 使用这个结构,因为它真的很难维护和索引。 相反,我建议使用这种结构:
"map": [
{ key:"id1", value: "value1" },
{ key:"id2", value: "value2" },
{ key:"id3", value: "value3" }
]
然后您可以分别为每个字段编制索引。