Meteor mongo更新嵌套数组

时间:2015-06-16 11:41:24

标签: arrays mongodb meteor nested database

示例文件:

{
"_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
         }
    }
);

我很乐意帮助你。

2 个答案:

答案 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()不存在,如何使用userIDstartDateendDate插入整个对象怎么办? - justdiehard Jun 14 at 20:20”

如果你试图把新的,你应该看看Meteor Accounts包,有像

这样的方法
Accounts.createUser(YOU_USER_SCHEME)