Meteor mongo 更新嵌套数组

Posted

技术标签:

【中文标题】Meteor mongo 更新嵌套数组【英文标题】:Meteor mongo updating nested array 【发布时间】: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
         
    
);

我会很高兴得到帮助。

【问题讨论】:

【参考方案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)

【讨论】:

以上是关于Meteor mongo 更新嵌套数组的主要内容,如果未能解决你的问题,请参考以下文章

通过 Meteor / Mongo 返回子文档数组

从数组中查找并返回第一个匹配的子文档(Meteor / Mongo)

当我们从 Mongo 控制台更新集合时,Meteor Apollo 没有更新 UI

如何将所有 Meteor Mongo 集合名称检索为 Javascript 数组?

如何在 javascript (meteor.js) 中操作返回的 mongo 集合/游标?

试图将我的数组(props)作为选择器传递给我的发布函数