MongoDB在文档中添加数组字段或仅使用对象

时间:2019-07-17 14:06:30

标签: mongodb upsert

例如,我们有很多人,每个人都是这样。

{name : 'john'}

现在,我想添加一个名为girlsfriends的数组字段,就像

{name : 'john', girlfriends: ['Stacy']}

通常如何进行?在应用程序代码中分两个步骤执行吗?

  1. 检查girlfriends文档上是否存在person字段?
  2. a。如果不存在:$ set person girlsfriends to ['Stacy']

    b。如果存在:将元素推送到数组吗?

所以要么这样做,要么 只需在每次创建文档时将数组字段初始化为[]?还是有些只是使用对象?生成一个随机ID作为密钥?

使用数组而不是对象有好处吗?似乎很麻烦查询。.

编辑: 好吧,没关系。我应该尝试使用$ push方法。对于遇到的任何人,当MongoDB文档说

时,它有点模棱两可
  

如果该字段不是数组,则操作将失败。

如果该字段不存在,它将为您创建它... ofc它的mongo ..

2 个答案:

答案 0 :(得分:2)

您可以在更新查询中直接使用$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" ] }

  

使用数组而不是对象有好处吗?

嗯,这是一个漫长的主题。但是长话短说,只有在使用Map的情况下,您才会被诱惑使用对象而不是数组。例如:

"map": {
  "id1": "value1",
  "id2": "value2",
  "id3": "value3"
}

我绝对建议使用此结构,因为它很难维护和建立索引。 相反,我建议使用以下结构:

"map": [
  { key:"id1", value: "value1" },
  { key:"id2", value: "value2" },
  { key:"id3", value: "value3" }
]

然后可以分别索引每个字段。

答案 1 :(得分:1)

不。这可以一步完成。请参阅$push

db.collectionName.update({'name' : 'John'}, {"$push" : {"gf" : "Stacy"}});
db.collectionName.update({'name' : 'John'}, {"$push" : {"gf" : "Nikki"}});

如果数组字段不存在,它将创建一个,否则,将其追加。