【问题标题】:Meteor mongo updating nested arrayMeteor mongo 更新嵌套数组
【发布时间】:2015-09-01 05:02:27
【问题描述】:

示例文档:

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

我会很高兴得到帮助。

【问题讨论】:

    标签: arrays mongodb meteor nested database


    【解决方案1】:

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

    这里的第二种情况是$push,其中该特定运算符意味着将元素“添加”到数组中。在您的情况下,您只想“更新”,所以这里的正确运算符是 $set:

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

    所以这里的positional $ operator 与数组元素中的“找到的索引”匹配,并允许$set 运算符“更改”在该“位置”匹配的元素。

    【讨论】:

    • 如果 Meteor.userId() 不存在怎么办,如何插入具有“userID”、“startDate”和“endDate”的整个对象?
    【解决方案2】:

    “如果Meteor.userId()不存在怎么办,如何插入带有userIDstartDateendDate的整个对象? – justdiehard Jun 14 at 20:20”

    如果你尝试添加新的,你应该看看 Meteor Accounts 包,有类似的方法

    Accounts.createUser(YOU_USER_SCHEME)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-05
      • 2017-01-05
      • 2021-07-20
      • 1970-01-01
      • 2016-02-08
      相关资源
      最近更新 更多