示例文件:
{
"_id" : "5fTTdZhhLkFXpKvPY",
"name" : "example",
"usersActivities" : [
{
"userId" : "kHaM8hL3E3As7zkc5",
"startDate" : ISODate("2015-06-01T00:00:00.000Z"),
"endDate" : ISODate("2015-06-01T00:00:00.000Z")
}
]
}
我是mongoDB的新手,我读到了有关更新嵌套数组的其他问题,我无法正确完成。我想要做的是为给定userId的用户更改startDate和endDate。我的问题是它始终将新对象推送到数组而不是使用给定的userId更改对象。
Activity.update(
_id: activityId, usersActivities: {
$elemMatch: {
userId: Meteor.userId()
}
}},
{
$push: {
'usersActivities.$.startDate': start,
'usersActivities.$.endDate': end
}
}
);
我很乐意帮助你。
答案 0 :(得分:9)
因此,首先要说的是$elemMatch
在您的情况下不是必需的,因为您只想匹配单个数组属性。当您需要来自同一数组元素的“两个或更多”属性以匹配您的条件时,可以使用该运算符。否则,您只需使用"dot notation"作为标准。
这里的第二种情况是$push
,其中特定的运算符意味着向元素“添加”元素。在您的情况下,您只想“更新”,因此这里的正确运算符是$set
:
Activity.update(
{ "_id": activityId, "usersActivities.userId": Meteor.userId() },
{
"$set": {
'usersActivities.$.startDate': start,
'usersActivities.$.endDate': end
}
}
)
所以这里的positional $
operator与数组元素中的“找到的索引”匹配,并允许$set
运算符“更改”在该“位置”匹配的元素。
答案 1 :(得分:0)
“如果Meteor.userId()
不存在,如何使用userID
,startDate
和endDate
插入整个对象怎么办? - justdiehard Jun 14 at 20:20”
如果你试图把新的,你应该看看Meteor Accounts包,有像
这样的方法Accounts.createUser(YOU_USER_SCHEME)