比如说,我们使用以下架构来定义评论树;
{
"_id" : ObjectId("id_here"),
"parentComment" : "This is my opinion",
"isHidden" : false,
"comments" : [
{
"comment" : "I disagree with your opinion",
"isHidden" : false
},
{
"comment" : "Test Post",
"isHidden" : false
},
....
}
因此,如果我们要更新父评论以将禁用短语的isHidden标志设置为true,我们就这样做;
var userComments = require('mongoose').model("UserComments");
for (let i = 0; i < bannedPhrases.length; i++) {
var conditions = { parentComment: bannedPhrases[i] }
, update = { isHidden: true}
, options = { multi: true };
userComments.update(conditions, update, options, callback);
}
现在,考虑子文档&#34; comments&#34; (线程注释,多个条目) - 我们如何才能更新这些?
答案 0 :(得分:4)
我能想到的解决方案是逐个更新嵌套文档。
假设我们已经掌握了被禁止的短语,这是一个字符串数组:
var bannedPhrases = ["censorship", "evil"]; // and more ...
然后我们执行查询以查找包含UserComments
任何内容的comments
的所有bannedPhrases
。
UserComments.find({"comments.comment": {$in: bannedPhrases }});
通过使用promises,我们可以一起异步执行更新:
UserComments.find({"comments.comment": {$in: bannedPhrases }}, {"comments.comment": 1})
.then(function(results){
return results.map(function(userComment){
userComment.comments.forEach(function(commentContainer){
// Check if this comment contains banned phrases
if(bannedPhrases.indexOf(commentContainer.comment) >= 0) {
commentContainer.isHidden = true;
}
});
return userComment.save();
});
}).then(function(promises){
// This step may vary depending on which promise library you are using
return Promise.all(promises);
});
如果您使用Bluebird JS是Mongoose的promise库,则可以简化代码:
UserComments.find({"comments.comment": {$in: bannedPhrases}}, {"comments.comment": 1})
.exec()
.map(function (userComment) {
userComment.comments.forEach(function (commentContainer) {
// Check if this comment contains banned phrases
if (bannedPhrases.indexOf(commentContainer.comment) >= 0) {
commentContainer.isHidden = true;
}
});
return userComment.save();
}).then(function () {
// Done saving
});
答案 1 :(得分:0)
此链接应有帮助:
https://jira.mongodb.org/browse/SERVER-1243
您可以做的是:
ParentComment.findById(parentCommendId, {'comments.$[].isHidden': true})
这是用英语说的,找到ID为parentCommendId
的评论,并将其子评论的“ isHidden”字段的全部设置为true。
希望这会有所帮助!
答案 2 :(得分:0)
要更新所有子文档,
db.coll.update({}, {$set: {“a.$[].b”: 2}})
Input: {a: [{b: 0}, {b: 1}]}
Output: {a: [{b: 2}, {b: 2}]}
要仅更新匹配的子文档,
db.coll.update({"a.b":0}, {$set: {“a.$[i].b”: 2}}, {arrayFilters: [{“i.b”: 0}]})
Input: {a: [{b: 0}, {b: 1}]}
Output: {a: [{b: 2}, {b: 1}]}
有关更新子文档的更多信息,请参阅此JIRA票证。