Node.js Mongoose修改.find()响应中的单个字段
我试图修改.find()中单个字段的结果,以删除不必要的数据。 如果字段Node.js Mongoose修改.find()响应中的单个字段,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我试图修改.find()中单个字段的结果,以删除不必要的数据。 如果字段likedBy(数组)不包含用户ID,则该字段应返回空数组。但是,当likedBy包含userId时,它应该只返回该userId而不是所有userId的数组 const response=wait MyObject.find().lean({ “喜欢的人”:{ “$elemMatch”:{ “$eq”:body.userId } }, }); 当userId='id-1'时的当前响应: { “_id”:“某个id”, “…
likedBy
(数组)不包含用户ID,则该字段应返回空数组。但是,当likedBy
包含userId时,它应该只返回该userId而不是所有userId的数组
const response=wait MyObject.find().lean({
“喜欢的人”:{
“$elemMatch”:{
“$eq”:body.userId
}
},
});
当userId='id-1'时的当前响应:
{
“_id”:“某个id”,
“…其余字段”
“喜欢的人”:[
“id-1”,
“id-2”,
“id-3”,
]
},
我想要的是:
{
“_id”:“某个id”,
“…其余字段”
“喜欢的人”:[
“id-1”,
]
},
您可以定义一个聚合
管道,并使用$filter
仅返回匹配的数组元素:
YourModel.aggregate([
{
$match: {
"likedBy": body.userId
}
},
{
$project: {
likedBy: {
$filter: {
input: "$likedBy",
as: "likedBy",
cond: {
$eq: [
"$$likedBy",
body.userId
]
}
}
},
otherField: 1
}
}
])
这里有一个例子。谢谢你的帮助,这几乎就是我想要的。如果我正确地使用它,那么当userId不匹配时(例如,当userId='id-10')将不返回任何内容,而当找不到userId时,我仍然希望返回所有字段的所有对象,并且只有likedBy字段为null或空数组。为什么不使用this
.forEach(doc=>doc.likedBy.includes(body.userId)&&doc.likedBy=body.userId)代码>附加到您的呼叫中。不过,您将再发送一些位。但tbh这可能更快。这绝对有效,但我认为在可能的情况下直接使用猫鼬会更好。好的,这取决于你。对我来说,你只需要一个简单的解决方案。管道的速度往往很慢。但解决方案越多越好。