Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongoose修改.find()响应中的单个字段_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js Mongoose修改.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”, “…

我试图修改.find()中单个字段的结果,以删除不必要的数据。 如果字段
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这可能更快。这绝对有效,但我认为在可能的情况下直接使用猫鼬会更好。好的,这取决于你。对我来说,你只需要一个简单的解决方案。管道的速度往往很慢。但解决方案越多越好。