阵列情况下mongodb中的$eq
在$lookup之后,我得到的结果是阵列情况下mongodb中的$eq,mongodb,Mongodb,在$lookup之后,我得到的结果是 "comments": [ { "_id": "58bd39a1518fb21803d8439d", "comment": "Task1-comment", "photo": null, "userId": "589056bcc74270b81a890dce", },
"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。请重新阅读我的答案。