mongoose Mongo Nodejs中db.find和db.aggregate的区别

omhiaaxx  于 2022-11-24  发布在  Go
关注(0)|答案(1)|浏览(204)

我想知道在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
    },
  }
})
u0njafvf

u0njafvf1#

聚合的主要目的是简化对大量条目的查询,并生成少量对您有价值的结果。
您也可以使用多个查找查询,但请记住,不能使用查找查询创建新字段。另一方面,$group阶段允许您定义新字段。
如果您的查询比较复杂,例如新增字段、加总字段或比较字段等,您可以使用汇总。它会花费较多时间,但结果比寻找更好。
欲了解更多详情,您可以跟踪此链接Aggregation vs Find

相关问题