如何在不使用 _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)
我想做的是更新满足
的子文档的内容
- feed.url
- comment.url
- 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"}})
但是即使 comments.url
或 comments.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
,否则文档将匹配
我有一个这样的示例架构 -
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) 我想做的是更新满足
的子文档的内容- feed.url
- comment.url
- 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"}})
但是即使 comments.url
或 comments.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