0

我有一个这样的示例模式 -

Comment.add({
    text:String,
    url:{type:String,unique:true},
    username:String,
    timestamp:{type:Date,default:Date}
});
Feed.add({
    url:{type:String, unique:true },
    username:String,
    message:{type:String,required:'{PATH} is required!'},
    comments:[Comment],
    timestamp:{type:Date,default:Date}
});

现在,我不想将 _id 字段暴露给外界,这就是为什么我不会将它发送给任何地方的客户。现在,我的评论模式中有两个重要属性(用户名,url)我想要做的是更新满足的子文档的内容

  1. feed.url
  2. 评论网址
  3. 评论.用户名

如果comment.username它与我的客户端值相同,req.user.username则更新comment.text其 url 由客户端在req.body.url变量中提供的记录的属性。

我认为一种耗时的方法是首先找到具有给定 url 的提要,然后遍历所有子文档以找到满足的文档,comment.url==req.body.url然后检查是否满足comment.username==req.user.username,更新评论对象。但是,我认为必须有一种更简单的方法来做到这一点?我已经试过了——

db.feeds.update({"username":"harshitladdha93@gmail.com","comments.username":"harshitladdha3@gmail.com","comments.url":"test"},{$set:{"comments.$.text":"updated text 2"}})

http://www.tagwith.com/question_305575_how-to-find-and-update-subdocument-within-array-based-on-parent-property找到

但即使在comments.urlorcomments.username匹配其他子文档时也会更新

我也试过

db.feeds.distinct("comments._id",{"comments.url":req.body.url})

查找与关联的文档的_id,url但它返回_id子文档中的所有

4

1 回答 1

1

首先 - 在安全方面,您不应该依赖于_id不被外界看到。这是一个非常糟糕的主意,原因有很多(主要是 REST,而且默认情况下它会随所有查询返回)。

现在,为了解决您的问题,您想要的是$elemMatch操作员。这表示您正在寻找数组中的指定子文档与多个查询匹配的内容。

例如

db.feeds.update({
    "username":"harshitladdha93@gmail.com",
    comments: {
        $elemMatch: {
            username: "harshitladdha3@gmail.com",
            url: "test"
        }
    }
}, {$set: {"comments.$.text":"updated text 2"}})

如果您不使用$elemMatch,则表示如果任何评论与您的​​查询匹配,您对文档没问题 - 即如果用户“harshitladdha3@gmail.com”有评论,并且单独的评论有一个 url “测试”,除非您使用,否则文档将匹配$elemMatch

于 2015-03-16T22:17:57.840 回答