NodeJS 如何查找未被另一个集合中的文档引用的文档

wooyq4lh  于 12个月前  发布在  Node.js
关注(0)|答案(2)|浏览(137)

我有两个模型叫做session和unreadcount。我需要从另一个表中获取特定的session计数。下面是我的两个MongoDB模型。

var UnreadCountSchema = new mongoose.Schema({
    userId: { type: String, required: true },
    sessionId: { type: String, required: true},
    unreadCount: { type: Number, required: true, default: 0  },
    isDeleted: { type: Boolean, required: true, default: 0 },
}, { timestamps: true });

module.exports = mongoose.model("UnreadCount", UnreadCountSchema);

var SessionSchema = new mongoose.Schema({
    name: { type: String, required: false },
    subject: { type: String, required: false },
    sessionCode: { type: String, required: false },
}, { timestamps: true });
module.exports = mongoose.model("Session", SessionSchema);

字符串
我没有使用引用和关系。当我获取会话时,我需要得到一个计数。我已经尝试查找它不起作用。建议一种方法来做到这一点。
下面是我执行的代码。计数在那里,但我没有得到结果。

const response = await SessionModel.aggregate([
    {
        $match: query,
    },
    {
        $lookup: {
            from: "UnreadCount",
            localField: "_id",
            foreignField: "sessionId",
            as: "unreadCounts",
        },
    },
    {
        $addFields: {
            unreadCount: {
                $cond: {
                    if: { $gt: [{ $size: "$unreadCounts" }, 0] },
                    then: { $arrayElemAt: ["$unreadCounts.unreadCount", 0] },
                    else: 0,
                },
            },
        },
    },
    // Optionally sort the sessions by lastMessage createdAt
    // { $sort: { "lastMessage.createdAt": -1 } },
])

8wigbo56

8wigbo561#

  • 将评论中的答案写为答案帖子 *。

确保两个字段必须具有相同的类型才能进行相等匹配。在这种情况下,您可以使用$lookup和管道将sessionId从UnreadCount集合转换为ObjectId

{
  $lookup: {
    from: "UnreadCount",
    let: {
      sessionId: "$_id"
    },
    pipeline: [
      {
        $match: {
          $expr: {
            $eq: [
              "$$sessionId",
              {
                $toObjectId: "$sessionId"
              }
            ]
          }
        }
      }
    ],
    as: "unreadCounts"
  }
}

字符串
也可以将Session集合中的_id转换为string类型。

{
  $lookup: {
    from: "UnreadCount",
    let: {
      sessionId: { $toString: "$_id" }
    },
    pipeline: [
      {
        $match: {
          $expr: {
            $eq: [
              "$$sessionId",
              "$sessionId"
            ]
          }
        }
      }
    ],
    as: "unreadCounts"
  }
}

ars1skjm

ars1skjm2#

我们必须使用在Mongodb数据库中创建的模型名称,并将对象ID转换为字符串。根据我们要比较的数据类型。
代码中提到的模型名称在数据库中是unreadCount,它就像unreadcount。

{
            $lookup: {
                from: "unreadcounts",
                let: { id: { $toString: "$_id" } },
                pipeline: [
                    {
                        $match: {
                            $expr: {
                                $eq: ["$sessionId", "$$id"]
                            }
                        }
                    }
                ],
                as: "unreadcounts"
            }
        }

字符串

相关问题