如何在 Mongoose 中找到使用的参照物?

m1m5dgzv  于 2022-11-13  发布在  Go
关注(0)|答案(1)|浏览(134)

考虑我有下面的表:

const ImageSchema = new mongoose.Schema({
  name: {
    type: String,
  },
  url: {
    type: String,
  },
  createdAt: {
    type: Date,
    default: Date.now(),
  },
  updatedAt: {
    type: Date,
    default: Date.now(),
  },
})

module.exports = mongoose.model("Image", ImageSchema)

另一个使用上述集合作为引用的集合:

const ProductSchema = new mongoose.Schema(
  {
    name: {
      type: String,
      required: [true, "Please add a product name"], 
    },
    
    photos: {
      type: [mongoose.Schema.ObjectId],
      ref: "Image",
    },
    createdAt: {
      type: Date,
      default: Date.now,
    },
    updatedAt: {
      type: Date,
      default: Date.now,
    },
  },
)

module.exports = mongoose.model("Product", ProductSchema)

然后是另一个使用这些集合的集合:

const ContainerSchema = new mongoose.Schema(
  {
    name: {
      type: String,
      required: [true, "Please add a product name"], 
    },
    
    products: {
      type: [mongoose.Schema.ObjectId],
      ref: "Product",
    },

    images: {
      type: [mongoose.Schema.ObjectId],
      ref: "Image",
    },
    createdAt: {
      type: Date,
      default: Date.now,
    },
    updatedAt: {
      type: Date,
      default: Date.now,
    },
  },
)

module.exports = mongoose.model("Container", ContainerSchema)

使用mongoose,我如何使用产品名称而不是产品ID来查询(查找)容器?
我的意思是,我可以通过以下方式使用产品ID查找容器:

const container = await Container.find({product : product_id});

但是我希望找到使用产品名称的容器。另外,请记住这些产品在容器中是作为数组使用的,我如何找到使用产品名称的容器?

7jmck4yq

7jmck4yq1#

采用聚集法可以更好地达到这些值。
我们需要使用**$elemMatch".$."**标签来搜索数组。

const container = await Container.aggregate([
        {
            $lookup:{
                from:'products',
                localField:'products',
                foreignField:'_id',
                as:'ProductContainerTable'
            }
        },
        {
            $match: {
                'ProductContainerTable.$.name' : productName
            },
        }
    ])

$match条件将被创建为;

{'ProductContainerTable': {$elemMatch: {name: productName }}}

霍普,这对你有帮助。

相关问题