[英]Find & Update partial nested collection
假設我有一個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的所有主題的等級。
同樣,我想避免任何過濾,因為其余的數據甚至不應該首先發送到客戶端。
謝謝!
您需要將查詢修改為以下內容:
Categories.find( { CategoryName: 'Cat1', 'Topics.TopicName': 'T1' }, { fields: { 'Topics.$': 1 }}, // make sure you put any other fields you want in here too ).fetch()
該查詢的作用是搜索與名稱Cat1
匹配的Category,並且在Topic
數組中具有TopicName
等於T1
的對象。
在fields
投影中,我們使用$
符號告訴MongoDB返回在查詢中找到的對象,而不是Topics
數組中的所有對象。
要更新此嵌套對象,您需要使用相同的$
符號:
Categories.update( { CategoryName: "Cat1", 'Topics.TopicName': 'T1' }, {$set: {'Topics.$.rating': 100 }, );
希望能有所幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.