使用独特的不起作用返回唯一的mongodb文档

每个消息文档都有一个messageTrackingId。我想返回所有消息,但排除具有相同messageTrackingId的文档。因此,例如,如果我的表中有4个文档,其中3个具有相同的messageTrackingId值,则Messages.find()应该只返回2个文档。

我正在尝试使用distinct仅返回唯一文档,因此我不会获得具有相同messageTrackingId的重复项。目前邮递员没有退回任何文件。

如果我改变了            Messages.find({query}).distinct('messageTrackingId') 至    Messages.find(query) 然后返回所有receiveId的文档。但是当我添加distinct时,没有任何结果。

app.get('/api/messages',(req,res,next)=>{
  query = {};
  inbox = false;
  messageId = false;
  if(req.query.recipientId){
    query = { recipientId: req.query.recipientId }
    inbox = true;

Messages.aggregate(// Pipeline
  [
      // Stage 1
      {
          $group: {
              _id: "$messageTrackingId",message : { $addToSet: '$message' },recipientId : { $addToSet: '$recipientId' },creator : { $addToSet: '$creator' },messageTrackingId : { $addToSet: '$messageTrackingId' },}
      },// Stage 2
      {
          $project: {
              _id: 1,message: { $arrayElemAt: ["$message",0 ] },recipientId: { $arrayElemAt: ["$recipientId",creator: { $arrayElemAt: ["$creator",messageTrackingId: { $arrayElemAt: ["$messageTrackingId",0 ] }
          }
      }

  ])

消息模型

const mongoose = require("mongoose");
const uniqueValidator = require("mongoose-unique-validator");

const messagingSchema = mongoose.Schema({
  creator: { type: mongoose.Schema.Types.ObjectId,ref: "User" },recipient: { type: String,required: true },recipientId: { type: String,message: { type: String,subject: { type: String,creationDate: { type: Date,messageTrackingId: { type: String }
  // readDate: { type: Date,required: true }
});


module.exports = mongoose.model("Messages",messagingSchema);
jiaoshi_910 回答:使用独特的不起作用返回唯一的mongodb文档

distinct将返回不同的字段,这不是您想要的。

您将需要使用aggregation并按messageTrackingId分组,然后在项目中获取所需的第一个消息内容,等等:

给出如下示例数据:

{ "messageTrackingId" : 1,"message" : "hello" }
{ "messageTrackingId" : 1,"message" : "bye" }
{ "messageTrackingId" : 2,"message" : "bye" }
{ "messageTrackingId" : 1,"message" : "hello" }

在MongoDB中:

db.getCollection("messages").aggregate(

// Pipeline
[
    // Stage 1
    {
        $group: {
            _id: "$messageTrackingId",message : { $addToSet: '$message' }
        }
    },// Stage 2
    {
        $project: {
            _id: 1,message: { $arrayElemAt: ["$message",0 ] }
        }
    },]);

要在猫鼬中使用,只需在模型上使用aggregate函数:

使用猫鼬

const result = await Message.aggregate(// Pipeline
        [
            // Stage 1
            {
                $group: {
                    _id: "$messageTrackingId",message : { $addToSet: '$message' }
                }
            },// Stage 2
            {
                $project: {
                    _id: 1,0 ] }
                }
            },]);

评论后更新

如果您需要查询给定的messageTrackingId,则将$match添加到管道的第一阶段:

const result = await Message.aggregate(
        [
            {
                $match: {
                    messageTrackingId: {$eq: 2}
                }
            },{
                $group: {
                    _id: "$messageTrackingId",{
                $project: {
                    _id: 1,]);
本文链接:https://www.f2er.com/3089396.html

大家都在问