Mongoose在使用populate时返回具有count的唯一文档



我有一个集合,它将存储相同数据的多个副本

在mongoose中是否有一种方法可以返回基于某个字段的所有唯一记录,并额外提供每个对象的count字段,同时使用populate来获取完整的文档?

一个简单的例子如下:

假设我的集合中的数据是这样的:

[
{
person: ObjectId("123"),
data: 'this will be random data',
_id: ObjectId("xxx")
},
{
person: ObjectId("456"),
data: 'this will be random data',
_id: ObjectId("xxx")
},
{
person: ObjectId("123"),
data: 'this will be random data',
_id: ObjectId("xxx")
}
]

因为我不想要数据字段,因为这个数据是随机的,我只想要一个唯一文档的计数,我的查询看起来像这样:

Model.find().select({'person':1})

现在我只有person字段和_id。

现在我想填充数据,所以我的查询看起来像这样:

Model.find().select({'person':1}).populate('person')

然后我得到这样的数据:

[
{
name: 'Jim',
salary: '200'
},
{
name: 'Mike',
salary: '150'
},
{
name: 'Jim',
salary: '200'
},
]

现在我最后想要得到的是这样的东西:

[
{
name: 'Jim',
salary: '200',
count: 2
},
{
name: 'Mike',
salary: '150',
count: 1
},
]

所有的随机字段都被删除了,我只得到一个填充的文档,其中包含每个唯一类型的计数。在本例中,name字段用作区分字段。

到目前为止,我还不能让这个工作,而使用填充。这是可能实现的猫鼬,还是需要一些人工计算?

您可能希望使用虚拟填充:

人模型:

const personSchema = new mongoose.Schema(
{
name: String,
},
{
// this is needed to display the virtual in json format, like res.json()
toJSON: { virtuals: true },
toObject: { virtuals: true },
}
);
personSchema.virtual("count", {
ref: "Task",
localField: "_id",
foreignField: "person",
count: true,
});

任务模型:

const taskSchema = mongoose.Schema({
person: { type: mongoose.Schema.Types.ObjectId, ref: "Person" },
data: String,
});

代替按任务模型搜索,您可以按人员模型搜索

const persons = await personModel.find().select("-_id").populate("count");

人收集:

{
"_id": "639222fa3f87b88812e95d1d",
"name": "jonh",
"__v": 0,
},
{
"_id": "639222fffcd0793b0580302e",
"name": "joseph",
"__v": 0,
}

任务集合:

{
"_id": "6392231815cd8663c5671edf",
"person": "639222fffcd0793b0580302e",
"data": "some data",
},
{
"_id": "6392231a15cd8663c5671ee1",
"person": "639222fffcd0793b0580302e",
"data": "some data",
},
{
"_id": "639223337409d3e1a1f741ac",
"person": "639222fa3f87b88812e95d1d",
"data": "some data",
}

和查询结果:

[
{
"_id": "639222fa3f87b88812e95d1d",
"name": "jonh",
"count": 1,
"id": "639222fa3f87b88812e95d1d"
},
{
"_id": "639222fffcd0793b0580302e",
"name": "joseph",
"count": 2,
"id": "639222fffcd0793b0580302e"
}
]

"id">

如果toJSON: { virtuals: true }

添加了字段,则可以忽略。我希望它对你有所帮助,这里的文档:在这里输入链接描述

最新更新