node.js - Mongoose 使用 $lookup 包含辅助文档中的字段

标签 node.js mongodb mongoose lookup

我想显示所有位置并将订单(如果有)附加到响应中。

位置文档示例:

{
  id: "LOCATION_A_OBJECTID",
  name: "Location A"
},
{
  id: "LOCATION_B_OBJECTID",
  name: "Location B"
},
{
  id: "LOCATION_C_OBJECTID",
  name: "Location C"
}

订单文档示例: (A 2 个订单,B 1 个订单,C 0 个订单)

{
  id: "5e17a001f1e0220def7a2b5d",
  location: "LOCATION_A_OBJECTID", 
  products: [1,2,3]
},
{
  id: "5e17a001f1e0220def7a2b5d",
  name: "LOCATION_B_OBJECTID",
  products: [1,2,3]
},
{
  id: "5e17a001f1e0220def7a2b5d",
  name: "LOCATION_A_OBJECTID",
  products: [1,2,3]
}

预期结果:

{
  id: "LOCATION_A_OBJECTID",
  name: ...
  products: ...
   ...
},
{
  id: "LOCATION_B_OBJECTID",
  name: ...
  products: ...
  ...
}
...

编辑 将在这里发布我的架构,因为有些事情是不对的。

订单架构

const mongoose = require('mongoose')

const orderSchema = mongoose.Schema({
  location: {
    type: mongoose.Schema.Types.ObjectId
  },
  timestamp: {
    type: Date, default: Date.now
  },
  status: Number,
  products: Array,
  total:   Number
})

module.exports = mongoose.model('Order', orderSchema)

位置架构:

const mongoose = require('mongoose')

const locationSchema = mongoose.Schema({
  name: String,
  address: String
})

module.exports = mongoose.model('Location', locationSchema)

最佳答案

您需要$lookup with custom pipelinenamelocation 字段匹配,然后只需运行 $project 即可获取结果文档所需的格式:

db.Locations.aggregate([
    {
        $lookup: {
            from: "Orders",
            let: { loc_id: "$_id" },
            pipeline: [
                { $match: { $expr: { $eq: [ "$$loc_id", "$_id" ] } } },
                { $project: { _id: 0, products: 1 } }
            ],
            as: "orders"
        }
    },
    {
        $match: { orders: { $ne: [] } }
    },
    {
        $project: {
            _id: 1,
            name: 1,
            products: "$orders.products"
        }
    }
])

Mongo Playground

关于node.js - Mongoose 使用 $lookup 包含辅助文档中的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59718750/

相关文章:

node.js - npm 错误!代码 ELIFECYCLE(起始问题)

node.js - 获取 45 秒前的正确时间戳

java - 使用 MongoDB 和 Java 存储数组

json - 如何仅在 Mongoose 中获取子文档?

node.js - Mongoose:查询数据库排除包含非拉丁字符的结果

node.js - 使用nodejs Connect的静态服务器中间件仅服务子目录

node.js - Node : worker disconnect() not working as expected

python - 使用 pymongo tailable 游标死于空集合

node.js - 来自其他容器的 Docker mongo 镜像 'Connection refused'

javascript - Mongoose 的日期错误