MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Gọi lại NodeJS sau nhiều hàm không đồng bộ trong vòng lặp

Có các cách tiếp cận phục vụ bạn có thể sử dụng ở đây dựa trên sự thuận tiện của bạn

Đang chờ sử dụng async

let article = await Article.findOne({ _id: articleid }).lean().exec()

await Promise.all(
  article.comment.map(async(obj) => {
    const user = await User.findOne({ _id: obj.user })
    obj.username = user.username
  })
)

console.log(article)

Sử dụng $ lookup tổng hợp 3.6

Vì mongodb có powerfull riêng nên $ lookup toán tử tổng hợp để tham gia nhiều tập hợp và có lẽ là cách tiếp cận tốt hơn mà không cần bất kỳ sự lặp lại nào

Article.aggregate([
  { "$match": { "_id": mongoose.Types.ObjectId(articleid) }},
  { "$unwind": "$comment" },
  { "$lookup": {
    "from": "users",
    "let": { "userId": "$comment.user" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": ["$$userId", "$_id"] }}}
    ],
    "as": "comment.user"
  }},
  { "$unwind": "$comment.user" },
  { "$group": {
    "_id": "$_id",
    "comment": { "$push": "$comment" },
    "completed": { "$first": "$completed" },
    "completedAt": { "$first": "$completedAt" }
  }}
])

Sử dụng $ lookup tổng hợp 3,4

Article.aggregate([
  { "$match": { "_id": mongoose.Types.ObjectId(articleid) }},
  { "$unwind": "$comment" },
  { "$lookup": {
    "from": "users",
    "localField": "comment.user",
    "foreignField": "_id",
    "as": "comment.user"
  }}
  { "$unwind": "$comment.user" },
  { "$group": {
    "_id": "$_id",
    "comment": { "$push": "$comment" },
    "completed": { "$first": "$completed" },
    "completedAt": { "$first": "$completedAt" }
  }}
])


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Quan hệ được nhúng hoặc được tham chiếu

  2. findOne Subdocument ở Mongoose

  3. MongoDB:chèn tài liệu với id cụ thể thay vì ObjectID được tạo tự động

  4. Trình điều khiển PHP72 MongoDB với Homebrew trên OSX

  5. Ví dụ về một giao dịch trong MongoDB 4.0 sử dụng PHP