假设我有一个Mongo集合,例如:
一般模式:有类别,每个类别都有一个主题数组,每个主题都有一个评分。
[
{CategoryName: "Cat1", ..., Topics: [{TopicName: "T1", rating: 9999, ...},
{TopicName: "T2", rating: 42, ....}]},
{CategoryName: "Cat2", ... , Topics: [...]},
...
]
在我的客户端流星代码中,我想顺利执行两个操作,而无需执行任何其他过滤操作:查找和更新。
我正在想象以下查找查询:
.find({CategoryName: "Cat1", Topics: [{TopicName: "T1"}]}).fetch()
但是,这将返回整个文档-我想要的结果只是部分的:
[{CategoryName: "Cat1", ..., Topics: [{TopicName: "T1", rating: 9999, ...}]}]
类似地,通过更新,我希望查询如下:
.update({CategoryName: "Cat1", Topics: [{TopicName: "T1"}]}, {$set: {Topics: [{rating: infinityyy}]}})
仅更新主题T1的等级,而不更新类别Cat1的所有主题。
同样,我想避免任何过滤,因为其余的数据甚至不应该首先发送给客户端。
谢谢!
答案 0 :(得分:0)
您需要将查询修改为以下内容:
Categories.find(
{ CategoryName: 'Cat1', 'Topics.TopicName': 'T1' },
{ fields: { 'Topics.$': 1 }}, // make sure you put any other fields you want in here too
).fetch()
此查询的作用是在Cat1
数组中搜索与名称TopicName
相匹配且类别为T1
等于Topic
的对象。
在fields
投影中,我们使用$
符号告诉MongoDB返回在查询中找到的对象,而不是返回Topics
数组中的所有对象
要更新此嵌套对象,您需要使用相同的$
符号:
Categories.update(
{ CategoryName: "Cat1", 'Topics.TopicName': 'T1' },
{$set: {'Topics.$.rating': 100 },
);
希望有帮助