Meteor mongo更新嵌套数组

Mos*_*sar 4 database arrays nested mongodb meteor

示例文档:

{
"_id" : "5fTTdZhhLkFXpKvPY",
"name" : "example",
"usersActivities" : [ 
    {
        "userId" : "kHaM8hL3E3As7zkc5",
        "startDate" : ISODate("2015-06-01T00:00:00.000Z"),
        "endDate" : ISODate("2015-06-01T00:00:00.000Z")
    }
]
}
Run Code Online (Sandbox Code Playgroud)

我是mongoDB的新手,我读了有关更新嵌套数组的其他问题,我无法正确完成.我想要做的是为给定userId的用户更改startDate和endDate.我的问题是它始终将新对象推送到数组而不是使用给定的userId更改对象.

Activity.update( 
    _id: activityId, usersActivities: {
         $elemMatch: {
             userId: Meteor.userId()
         }
     }},
    {
        $push: {
            'usersActivities.$.startDate': start,
            'usersActivities.$.endDate': end
         }
    }
);
Run Code Online (Sandbox Code Playgroud)

我很乐意帮忙.

小智 9

因此,首先要说的$elemMatch是在您的情况下不需要,因为您只想匹配单个数组属性.当您需要来自同一数组元素的"两个或更多"属性以匹配您的条件时,可以使用该运算符.否则你只需使用"点符号"作为标准.

这里的第二种情况是$push,其中该特定运算符意味着向元素"添加"元素.在您的情况下,您只想"更新",因此这里的正确运算符是$set:

Activity.update(
    { "_id": activityId, "usersActivities.userId": Meteor.userId() },
    {
        "$set": {
            'usersActivities.$.startDate': start,
            'usersActivities.$.endDate': end
        }
    }
)
Run Code Online (Sandbox Code Playgroud)

因此,这里的位置$运算符与数组元素中的"找到的索引"匹配,并允许$set运算符"更改"在该"位置"匹配的元素.