如何在不使用 _id 字段但使用多个属性的情况下在猫鼬中查找子文档

How to find a sub document in mongoose without using _id fields but using multiple properties

我有一个这样的示例架构 -

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. comment.url
  3. comment.username

如果 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.urlcomments.username 匹配其他子文档

也会更新

我也试过了

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

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

首先 - 在安全方面,您不应该依赖 _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 "test",除非您使用 $elemMatch

,否则文档将匹配