将文档插入数组字段

3

我对mongodb不太熟悉,所以很难操作子文档。我的目标是实现这样的通讯录:

{
    [user1@mail.com]: [
        {
            email: 'aaa@example.com',
            createdAt: '0000-00-00',
            updatedAt: '0000-00-00'
        }
    ],
    [user@mail.com]: [
        { ... },
        { ... }
    ]
}

我将那个集合称作“addressbook”,每个条目都是数组类型,用于包含地址信息,例如电子邮件、图片、创建日期等。
问题在于我不知道该如何实现。看起来我需要使用一些操作符,比如$addToSet或$push,但我不知道如何正确地使用它们。我尝试过以下方法:
update({
    email: 'user1@mail.com'
}, {
    $push: {
        'address.$email': {
            email: target,
            createdAt: new Date(),
            updatedAt: new Date()
        }
    }
})

我知道一件事,使用upsert选项更新集合可以在文档不存在的情况下创建新文档,但是仍然无法创建文档。非常感谢您给予帮助。


你可能会在嵌套文档时遇到一些麻烦。MongoDB 在更新深度嵌套的文档时可能会出现问题。 - Julian Guterman
哦,谢谢。我忘了告诉你这是MongoDB。 - modernator
1
请展示有效的 BSON 文档,而不是“伪文档”。 - styvane
我还没有创建,因为查询不起作用。我在Mongo shell中尝试过,它说:“'address.$email'中以美元符号($)为前缀的字段'$email'对于存储无效”。 - modernator
你对 'address.$email' 想要做什么?你的需求不是很清楚。 - Shrabanee
显示剩余2条评论
1个回答

1
看起来这个结构将所有用户数据保存在一个文档中。这可能在未来处理时非常棘手,因为bson文档有16MB的容量限制。
如果你能考虑更简单的文档形式:
{
   _id:bsonId,       
   email: 'aaa@example.com',
   createdAt: '0000-00-00',
   updatedAt: '0000-00-00',
   name: "unknown"
 }

那么更新和维护您的收藏将变得更加容易。
db.addressbook.update({ email: 'aaa@example.com'},{name:"Happy User"})

哦...我忘记限制每个文档的数量了。我应该尝试一下。谢谢 :) - modernator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接