mongodb 获取所有文章的页面大小为10和每篇文章得到填充一些所需的用户信息

erhoui1w  于 2023-11-17  发布在  Go
关注(0)|答案(1)|浏览(132)

我创建了两个模型,即用户,文章。他们的数据结构如下;

const userSchema = Schema({
  name: String,
  email: String,
  password: String
});
const User = mongoose.model(‘user’, userSchema);
module.exports = User;

——

const articleSchema = Schema({
  liked: Array,  // liked contains users’ _id who like this article
  content: String
})
const Article = mongoose.model(‘article’, articleSchema);
module.exports = Article

——

字符串
我想得到的页面大小为10和每篇文章得到填充一些用户的信息谁喜欢这篇文章的所有文章。
例如,让我们想象用户表和文章表的数据如下:

users = [
 { 
    _id: 1,
    name: ‘a’,
    email: ‘a.com’,
    password: ‘a’
 },
 { 
    _id: 2,
    name: ‘b’,
    email: ‘b.com’,
    password: ‘b’
 }
]

articles = [
  {
    _id: 1,
    liked: [1,2],
    content: “a&b”
  },
  {
     _id: 2,
     liked: [1],
     content: “a”
  }
]


预期结果是:

articles = [
   {
      _id: 1,
      liked: [
      { 
         _id: 1,
         name: ‘a’,
         email: ‘a.com’,
         password: ‘a’
       },
       { 
         _id: 2,
         name: ‘b’,
         email: ‘b.com’,
         password: ‘b’
       }
     ],
     content: “a&b”
   },
   {
       _id: 2,
       liked: [
       { 
          _id: 1,
          name: ‘a’,
          email: ‘a.com’,
          password: ‘a’
        }
       ],
        content: “a”
    }
]


我试着用Model.find(query)Model.aggregate(pipeline)来解决这个问题,但是这两种方法各有利弊,都不能达到好的效果。请给予我一个建议。

baubqpgj

baubqpgj1#

根据你在Model.aggregate()查询中分享的内容,一个简单的$lookup会得到这样的输出:

const articles = await Article.aggregate([
  {
    "$lookup": {
      "from": "users",
      "localField": "liked",
      "foreignField": "_id",
      "as": "liked"
    }
  }
]);

字符串
请参阅HERE以获取工作示例。
但是,如果您要将模式更改为使用引用的文档,则可以在查询检索时使用populateArticle.liked数组中的每个_id替换为相应的User文档。
这就是你如何使用populate:

const articleSchema = Schema({
  liked: [{ 
      type: mongoose.Schema.Types.ObjectId, 
      ref: 'User' // create a reference to User
   }],  
  content: String
})


然后做

const articles = await Article.find().populate({path: 'liked', model: User});

注意:这个populate()的例子工作在每个User文档的每个User._id字段都是mongoose ObjectId类型的 predicate 上。

相关问题