阵列情况下mongodb中的$eq

阵列情况下mongodb中的$eq,mongodb,Mongodb,在$lookup之后,我得到的结果是 "comments": [ { "_id": "58bd39a1518fb21803d8439d", "comment": "Task1-comment", "photo": null, "userId": "589056bcc74270b81a890dce", },

在$lookup之后,我得到的结果是

 "comments": [
        {
            "_id": "58bd39a1518fb21803d8439d",                
            "comment": "Task1-comment",
            "photo": null,
            "userId": "589056bcc74270b81a890dce",                
        },
        {
            "_id": "58c034cc3c9af5141bca8a24",             
            "comment": "Dude",
            "photo": null,
            "userId": "589035b8603c0e9ebe5369c5",               
        }
现在我需要设置一个布尔值,比如“userComment”,如果有任何元素匹配作为输入的userId。 我在聚合管道中写道

$project: { "userComment": { $eq: ["$comments.userId", mongoose.Types.ObjectId(userId)] } },
然后输入用户ID为589035b8603c0e9ebe5369c5 但它只将userComment返回为false


我怎样才能解决这个问题?非常感谢您提供的任何帮助

我认为错误是在比较数组值之前,即“注释”,您需要首先展开数组,因为只有这样,您才能在数组内部移动数组上的光标,因此请编写代码{$unwind:$comments”},然后应用项目查询。请记住,在展开之前,您需要先投影“comments”数组。

我是这样解决的

$project:{    
          "commentCount": {
                        "$filter": {
                            "input": "$comments",
                            "as": "comments",
                            "cond": { "$eq": ["$$comments.userId", mongoose.Types.ObjectId(userId)] }
                             }
                          }
          },
$project: { "userComments": { $cond: { if: { $gt: [{ $size: '$commentCount' }, 0] }, then: true, else: false } } }

使用$project两次,然后得到预期结果

ID是简单字符串,而不是ObjectId或guid?ID是我作为{$eq:[“$comments.userId”,mongoose.Types.ObjectId(userId)]}尝试过的ObjectId。mongoose模式类型在这里不适用于比较,因为它实际上是一个“包装对象”当被“mongoose methods only”调用时,它会发出一个适当的
ObjectId
。相反这将允许将您的“字符串”强制转换为正确的类型。这是我作为mongoose.Types.ObjectId(userId)尝试过的,但它不会得到我需要与注释数组中的任何userId进行比较的预期输出,如果找到任何匹配项,则需要返回true或false mongoose.Types.ObjectId(userId)已经是ObjectId,但您的“userId”是Strign,所以我认为一切都很好,你能打印用户ID的类型,看看它是否是字符串吗??因为我认为它不是一个字符串。另外,如果这对您不起作用,那么您可以投影userID,并在您的代码中手动编写比较逻辑。在项目本身中,我使用这个,我只需要投影true或false。请重新阅读我的答案。