首页 > 解决方案 > 在聚合管道$eq diff值中查询嵌入文档的mongo数组

问题描述

我有一系列 mogoDB 嵌入式文档


const ArticleSchema = new mongoose.Schema({
    title: { type: String, required: true },
    author: { type: mongoose.Schema.Types.ObjectId, ref: "User", required: true },
    group: { type: mongoose.Schema.Types.ObjectId, ref: "ArticleGroup" },
});
// ArticleGroup
const ArticleGroupSchema = new mongoose.Schema({
    name: { type: String, required: true },
    desc: { type: String, default: "" },
    state: { type: String, required: true, default: "public" },
    members: [
        {
            desc: String,
            role: String,
            user: { type: mongoose.Schema.Types.ObjectId, ref: "User", required: true },
        },
    ],
});
// User
const userSchema = new mongoose.Schema(
    {
        email: { type: String, unique: true },
        password: String,
    },
);

测试数据 :

  {
    _id: "6131aa5b367318e2df14b988",
    title: "功能更新清单",
    author: ObjectId("607edeb4b1e1bea9acb5af38"),
    group: ObjectId("612d00a43c52975d4ade10d4")
  }

我想通过比较“author._id == group.members”向文档中添加一个新字段“can_edit”。“聚合”管道中的用户。

 Article.aggregate([
{
  $lookup: {
       from: "users",
       localField: "author",
       foreignField: "_id",
       as: "author",
     },
 },
{
    $lookup: {
      from: "articlegroups",
      localField: "group",
      foreignField: "_id",
      as: "group"
    }
},
  {
     $addFields: {
          can_edit: {
                        $eq: ["$group.members.user", "$author._id"],
                      },
                }
  }
])

但是,我得到的'can_edit'始终是'false',并且我确信我的测试数据中的'author._id'值与'group.members'相同。

我要获取数据:</p>

  {
    _id: "6131aa5b367318e2df14b988",
    can_edit: true,
    title: "功能更新清单",
    author: {
      _id: "607edeb4b1e1bea9acb5af38",
      email: "frmachao@126.com",
      
    },
    group: {
      _id: "612d00a43c52975d4ade10d4",
      desc: "开发&quot;,
      state: "public",
      name: "开发小组&quot;,
      members: [
        {
          _id: "612d00a43c52975d4ade10d5",
          role: "admin",
          user: "607edeb4b1e1bea9acb5af38",
          
        }
      ]
    }
  }

有什么方法可以满足我的需求吗?有谁知道这是怎么做到的吗?我会很感激你的。

刚才,我尝试:

Article.aggregate([
{
  $lookup: {
       from: "users",
       localField: "author",
       foreignField: "_id",
       as: "author",
     },
 },
{
    $lookup: {
      from: "articlegroups",
      localField: "group",
      foreignField: "_id",
      as: "group"
    }
},
  {
    $addFields: {
      can_edit: {
        $in: [
          "$author._id",
          "$group.members.user"
        ],
      },
    },
  }
])

但是,我得到的“can_edit”总是“假”

标签: javascriptmongodb

解决方案


$in (aggregation),

返回一个布尔值,指示指定的值是否在数组中。

$in: [
  "$author._id",
  "$group.members.user"
]

更新:

由于 Post Owner 添加了问题:

$in 需要一个数组作为第二个参数

这意味着$group.members可能是 null 而不是数组。

为检查添加条件检查$group.members必须是一个数组。

{
  case: {
    $ne: [
      {
        "$type": "$group.members"
      },
      "array"
    ]
  },
  then: false
},

$ne- 不等于检查

$type- 返回 BSON 类型的字段

完整查询:

db.collection.aggregate([
  {
    $addFields: {
      can_edit: {
        $switch: {
          branches: [
            {
              case: {
                $ne: [
                  {
                    "$type": "$group.members"
                  },
                  "array"
                ]
              },
              then: false
            },
            {
              case: {
                $ne: [
                  {
                    "$type": "$group.members"
                  },
                  "array"
                ]
              },
              then: false
            },
            {
              case: {
                $in: [
                  "$author._id",
                  "$group.members.user"
                ]
              },
              then: true
            }
          ],
          default: false
        }
      }
    }
  }
])

示例 1 在 Mongo 游乐场


或者,可以缩短查询$switch而不需要$in返回相同的布尔结果。

$and- 多个表达式的逻辑与

完整查询:

db.collection.aggregate([
  {
    $addFields: {
      can_edit: {
        $and: [
          {
            $eq: [
              {
                "$type": "$group.members"
              },
              "array"
            ]
          },
          {
            $in: [
              "$author._id",
              "$group.members.user"
            ]
          }
        ]
      }
    }
  }
])

Mongo Playground 中的示例 2


推荐阅读