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()
不存在怎么办,如何插入带有userID
、startDate
和endDate
的整个对象? – justdiehard Jun 14 at 20:20”
如果你尝试添加新的,你应该看看 Meteor Accounts 包,有类似的方法
Accounts.createUser(YOU_USER_SCHEME)
【讨论】:
以上是关于Meteor mongo 更新嵌套数组的主要内容,如果未能解决你的问题,请参考以下文章
从数组中查找并返回第一个匹配的子文档(Meteor / Mongo)
当我们从 Mongo 控制台更新集合时,Meteor Apollo 没有更新 UI
如何将所有 Meteor Mongo 集合名称检索为 Javascript 数组?