我正在重新思考如何构建当前存储在Users
集合中的一些数据。以前,我的服务器会收到消息,找到具有正确profile.website
字段的用户文档,并将项目推送到profile.siteMessages
数组中:
{
"_id": "hr9ck5Fis5YuvqCqP",
"profile": {
"website": "localhost",
"siteMessages": [
{
"text": "sddsd",
"createdAt": 1482001227204
},
]
}
}
我想将结构更改为类似以下内容。而不是在profile
的顶级数组中存储多条消息可能来自同一用户的所有消息,而是包含profile.siteVisitors
的{{1}}字段,然后消息数组:
visitorId
保持上面显示的结构,我将如何查询和更新{
"_id": "dgfsdfdfsdf",
"emails": [
{
"address": "user2@test.com",
"verified": false
}
],
"profile": {
"website": "localhost",
"siteVisitors:" [
{
"visitorId": "74585242",
"messages": [
{
"text": "A string",
"createdAt": 1482001260853
},
{
"text": "Another string",
"createdAt": 1482001260854
}
]
},
{
"visitorId": "76672242",
"messages": [
{
"text": "A string",
"createdAt": 1482001260855
}
]
}
]
}
}
数组?目前,我使用以下内容查询和更新集合:
profile.siteVisitiors.messages
如何更新新结构化的消息数组?我需要匹配Meteor.users.update(
{'profile.website': url},
{$push: {'profile.siteMessages': msgItem}},
function(err) {
if (err) {
console.log('whoops!' + err)
} else {
//success
}
});
个文档User
字段,匹配profile.website
数组中的visitorId
,然后将新元素推入profile.siteVisitors
数组,但我不确定这看起来像是一个MongoDB查询。
编辑我已经将以下内容合并到一起似乎有效,但非常难看。我怎样才能改善这个?
messages
答案 0 :(得分:1)
您可以使用$(update)运算符。
尝试以下查询:
db.collection.update(
{"profile.website" : "localhost" , "profile.siteVisitors" : {$elemMatch: {"visitorId" :'76672242'} } },
{ $push: { "profile.siteVisitors.$.messages": {"text" : <newText>, "createdAt" : <newCreatedDate>} } }
)
希望这会有所帮助。