Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获取一个错误&x27;Can';t从BSON类型objectId转换为字符串';使用MongoDB聚合时_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript 获取一个错误&x27;Can';t从BSON类型objectId转换为字符串';使用MongoDB聚合时

Javascript 获取一个错误&x27;Can';t从BSON类型objectId转换为字符串';使用MongoDB聚合时,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我正在尝试获取用户1和用户N之间每次对话的最后一条消息 我已经成功地编译了下面的代码,但是它抛出了上面提到的错误。我如何用ObjectId解决这个问题,因为这是我在DB中拥有的,而不是字符串 await MostRecentMessages.aggregate( [ { $match: { $or: [ { from: mongoose.Types.ObjectId(id) },

我正在尝试获取用户1和用户N之间每次对话的最后一条消息

我已经成功地编译了下面的代码,但是它抛出了上面提到的错误。我如何用ObjectId解决这个问题,因为这是我在DB中拥有的,而不是字符串

    await MostRecentMessages.aggregate(
      [
        {
          $match: {
            $or: [
              { from: mongoose.Types.ObjectId(id) },
              { to: mongoose.Types.ObjectId(id) }
            ],
            deletedBy: { $ne: id }
          }
        },
        { $sort: { date: -1 } },
        { $project: { _id: 1, from: 1, to: 1, conversation: 1, date: 1 } },
        {
          $group: {
            _id: {
              lastMessage: {
                $cond: [
                  {
                    $gt: [
                      { $substr: ["$to", 0, 1] },
                      { $substr: ["$from", 0, 1] }
                    ]
                  },
                  { $concat: ["$to", " and ", "$from"] },
                  { $concat: ["$from", " and ", "$to"] }
                ]
              }
            },
            conversation: { $first: "$$ROOT" }
          }
        },
        {
          $lookup: {
            from: "conversations",
            localField: "conversation",
            foreignField: "_id",
            as: "conversation"
          }
        },
        { $unwind: { path: "$conversation" } },
        {
          $lookup: {
            from: "users",
            localField: "to",
            foreignField: "_id",
            as: "to"
          }
        },
        { $unwind: { path: "$to" } },
        {
          $lookup: {
            from: "users",
            localField: "from",
            foreignField: "_id",
            as: "from"
          }
        },
        { $unwind: { path: "$from" } }
      ],
      function(err, docs) {
        if (err) {
          console.log(err);
        } else {
          console.log("MostRecentMessages", docs);
          return res.json(docs);
        }
      }
    );
我的模式,如果重要的话:

const MostRecentMessageSchema = new Schema({
  to: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "user"
  },
  from: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "user"
  },
  conversation: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "conversation"
  },
  deletedBy: {
    type: [String]
  },
  date: {
    type: Date,
    default: Date.now
  }
});

编辑 以下是5份相关文件:

// db.MostRecentMessages

_id:5dca7a61e95bd3341cad64b9
to:5dca58c21825d8269a32cb10
from:5dca58ce1825d8269a32cb11
conversation:5dca7aea51b626350fa865dd
date:2019-11-12T09:24:49.906+00:00

_id:5dca7ab0d3a44a34c98b7263
to:5dca58ce1825d8269a32cb11
from:5dca58c21825d8269a32cb10
conversation:5dca7ab0d3a44a34c98b7262
date:2019-11-12T09:26:08.125+00:00

我复制并粘贴了下面的答案,但它只返回带有文本
Test2

的消息,注释中的链接仅供参考。。。 现在让我们看看是什么在起作用(这对你来说可能听起来像“似曾相识”,但它起作用了!)。所有(以及您前面提到的错误)都发生在$group阶段

db.lastMessage.aggregate([
  {
    $match: {
      $or: [
        {
          from: ObjectId("5a934e000102030405000001")
        },
        {
          to: ObjectId("5a934e000102030405000001")
        }
      ],
      deletedBy: {
        $ne: ObjectId("5a934e000102030405000001")
      }
    }
  },
  {
    $sort: {
      date: -1
    }
  },
  {
    $project: {
      _id: 1,
      from: 1,
      to: 1,
      conversation: 1,
      date: 1
    }
  },
  {
    $group: {
      _id: {
        userConcerned: {
          $cond: {
            if: {
              $eq: [
                "$to",
                ObjectId("5a934e000102030405000001")
              ]
            },
            then: "$to",
            else: "$from"
          }
        },
        interlocutor: {
          $cond: {
            if: {
              $eq: [
                "$to",
                ObjectId("5a934e000102030405000001")
              ]
            },
            then: "$from",
            else: "$to"
          }
        }
      },
      from: {
        $first: "$from"
      },
      to: {
        $first: "$to"
      },
      date: {
        $first: "$date"
      },
      conversation: {
        $first: "$conversation"
      }
    }
  },
  {
    $lookup: {
      from: "conversations",
      localField: "conversation",
      foreignField: "_id",
      as: "conversation"
    }
  },
  {
    $unwind: {
      path: "$conversation"
    }
  },
  {
    $lookup: {
      from: "users",
      localField: "to",
      foreignField: "_id",
      as: "to"
    }
  },
  {
    $unwind: {
      path: "$to"
    }
  },
  {
    $lookup: {
      from: "users",
      localField: "from",
      foreignField: "_id",
      as: "from"
    }
  },
  {
    $unwind: {
      path: "$from"
    }
  }
])

。我刚刚用我在你的另一个问题中已经提供的步骤修改了你的分组步骤。

我已经做了一个示例来演示我所做的以及我得到的结果,查询工作如预期的那样。。。什么是pb?但令人惊讶的是,“测试3”的对话从未在最后一条消息中被提及……你是什么意思?它被引用<每次用户A向用户B发送消息时,code>lastMessage都会更新。因此,当用户A发送“Test1”时,
lastMessage
链接到该
Test1
消息。然后,当用户A发送“Test3”时,
lastMessage
被更新为“Test3”消息。查询按预期工作,但未按预期工作。问题是应返回“Test3”。。但是我发送给你的POC返回了“Test2”消息。好吧,我的错,它被引用了。但第一条最新消息的日期(日期:2019-11-12T09:24:49.906+00:00)与其引用的createdAt对话日期(createdAt:2019-11-12T09:27:06.562+00:00)不一致!因此,最后一条“lastMessage”是第二条,因为您按lastMessage.date排序,而不是按conversation.createdAt排序。我怀疑您在创建新对话时从未更新此字段,仅更新对话id。
db.lastMessage.aggregate([
  {
    $match: {
      $or: [
        {
          from: ObjectId("5a934e000102030405000001")
        },
        {
          to: ObjectId("5a934e000102030405000001")
        }
      ],
      deletedBy: {
        $ne: ObjectId("5a934e000102030405000001")
      }
    }
  },
  {
    $sort: {
      date: -1
    }
  },
  {
    $project: {
      _id: 1,
      from: 1,
      to: 1,
      conversation: 1,
      date: 1
    }
  },
  {
    $group: {
      _id: {
        userConcerned: {
          $cond: {
            if: {
              $eq: [
                "$to",
                ObjectId("5a934e000102030405000001")
              ]
            },
            then: "$to",
            else: "$from"
          }
        },
        interlocutor: {
          $cond: {
            if: {
              $eq: [
                "$to",
                ObjectId("5a934e000102030405000001")
              ]
            },
            then: "$from",
            else: "$to"
          }
        }
      },
      from: {
        $first: "$from"
      },
      to: {
        $first: "$to"
      },
      date: {
        $first: "$date"
      },
      conversation: {
        $first: "$conversation"
      }
    }
  },
  {
    $lookup: {
      from: "conversations",
      localField: "conversation",
      foreignField: "_id",
      as: "conversation"
    }
  },
  {
    $unwind: {
      path: "$conversation"
    }
  },
  {
    $lookup: {
      from: "users",
      localField: "to",
      foreignField: "_id",
      as: "to"
    }
  },
  {
    $unwind: {
      path: "$to"
    }
  },
  {
    $lookup: {
      from: "users",
      localField: "from",
      foreignField: "_id",
      as: "from"
    }
  },
  {
    $unwind: {
      path: "$from"
    }
  }
])