查找和更新部分嵌套集合

时间:2018-07-16 21:43:32

标签: mongodb meteor partial

假设我有一个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的所有主题。

同样,我想避免任何过滤,因为其余的数据甚至不应该首先发送给客户端。

谢谢!

1 个答案:

答案 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 }, );

希望有帮助