我想知道在MongoDB中db.find和db.aggregate的输出有什么不同。
我正在使用Nodejs从Mongo DB中查询一些数据,当前的实现是:
Document.find(
{ userid: mongoose.Types.ObjectId(userId) },
{
'_id':1,
'name':1,
'size':1,
})
但是我想在运行中使用数据库中的值计算大小,所以我知道我不能在查找查询中更改值,所以我必须使用聚合:
Document.aggregate([
{$match:{userid: mongoose.Types.ObjectId(userId), isDeleted: deleted }},
{$project:{
'_id':1,
'name':1,
'size': {$size: "$followers"}
}}
])
现在,两个查询都给予相同的结果,我还用typeof()检查了两个返回对象的数据类型。
但是当聚合函数返回结果时,它会在我的另一个使用map的函数上抛出一些错误。
document = await Promise.all(document.map(async(doc) => {
let followerData
if (doc.size > 0) {
const icon = await getIcon(doc.name)
if (icon){
followerData = {
socialIcon: icon,
name: name,
}
}
}
return { ...doc._doc, followerData }
}))
现在,这个函数可以使用find,但不能使用aggregate,它只添加了followerData,并删除了从数据库中获取的现有数据。不知道这里发生了什么。有人能帮助我吗?
计划:
var socialSchema = new Schema({
userid: {
type: mongoose.Schema.Types.ObjectId,
ref: 'users',
required: true,
},
name: { type: String, max: 255 },
followers: [
{
name: { type: String },
handle: { type: String },
},
],
size: {
type: Number,
default: function() {
return this.followers.length
},
}
})
1条答案
按热度按时间u0njafvf1#
聚合的主要目的是简化对大量条目的查询,并生成少量对您有价值的结果。
您也可以使用多个查找查询,但请记住,不能使用查找查询创建新字段。另一方面,$group阶段允许您定义新字段。
如果您的查询比较复杂,例如新增字段、加总字段或比较字段等,您可以使用汇总。它会花费较多时间,但结果比寻找更好。
欲了解更多详情,您可以跟踪此链接Aggregation vs Find