首页 > 解决方案 > 使用聚合查询出现错误,“字段名称 '$acknowledged' 不能是运算符名称”

问题描述

我正在尝试获取用户 A 和任何其他用户之间的所有最新消息。

我一直遇到错误,

The field name '$acknowledged' cannot be an operator name

不知道我在这里做错了什么。蒙哥游乐场

预期的输出应该是具有 id 的用户与5a934e000102030405000001任何其他用户之间交换的最新消息。

[
    {
      "from": ObjectId("5a934e000102030405000002"),
      "to": ObjectId("5a934e000102030405000001"),
      "acknowledged": true,
      date: "2020-04-17T18:26:34.353+00:00"
    },
    {
      "from": ObjectId("5a934e000102030405000001"),
      "to": ObjectId("5a934e000102030405000003"),
      "acknowledged": false,
      date: "2020-04-17T18:26:31.353+00:00"
    },
    {
      "from": ObjectId("5a934e000102030405000004"),
      "to": ObjectId("5a934e000102030405000001"),
      "acknowledged": false,
      date: "2020-04-17T18:26:29.353+00:00"
    },
]

标签: javascriptmongodb

解决方案


你在这里有一个错字:

$acknowledged: {                     acknowledged: {
   $first: "$acknowledged",   -->      $first: "$acknowledged"
                                     }
},
                              and
then: "$responseTo",          -->    then: "$to",

db.Message.aggregate([
  {
    $match: {
      $or: [
        {
          from: {
            $in: [
              ObjectId("5a934e000102030405000001")
            ]
          }
        },
        {
          to: {
            $in: [
              ObjectId("5a934e000102030405000001")
            ]
          }
        }
      ]
    }
  },
  {
    $sort: {
      date: -1
    }
  },      
  {
    $group: {
      _id: {
        userConcerned: {
          $cond: [
            {
              $in: [
                "$to",
                [
                  ObjectId("5a934e000102030405000001")
                ]
              ]
            },
            "$to",
            "$from"
          ]
        },
        interlocutor: {
          $cond: [
            {
              $in: [
                "$to",
                [
                  ObjectId("5a934e000102030405000001")
                ]
              ]
            },
            "$from",
            "$to"
          ]
        }
      },
      id: {
        $first: "$_id"
      },
      from: {
        $first: "$from"
      },
      acknowledged: {
        $first: "$acknowledged"
      },
      to: {
        $first: "$to"
      },
      date: {
        $first: "$date"
      }
    }
  },
  {
    $lookup: {
      from: "User",
      localField: "to",
      foreignField: "_id",
      as: "to"
    }
  },
  {
    $unwind: "$to"
  },
  {
    $lookup: {
      from: "User",
      localField: "from",
      foreignField: "_id",
      as: "from"
    }
  },
  {
    $unwind: "$from"
  },
  {
    $project: {
      _id: 0,
      date: 1,
      acknowledged: 1,
      from: "$from._id",
      to: "$to._id"
    }
  }
])

Mongo游乐场


推荐阅读