猫鼬:如何查询嵌套文档并返回String结果?

进行查询Product.findOne({'variation.sku': req.params.productVariationSKU },{'_id': 0, 'variation.price' :1})以查找产品变化的价格。

但是结果返回了所有产品变化的价格。需要帮助来找出问题所在!

以下是产品架构:

var ProductSchema = new Schema({
    productId: {
        type: Number,
        required: [true, 'Product ID is required'],
        unique: true
    },
    sku: String,
    category: [String],
    language: {
        type: String,
        lowercase: true,
        maxlength: 2,
        required: [true, 'Language code required'],
        index: true,
        unique: true
    },
    name: {
        type: String,
        required: [true, 'Product name is required']
    },
    descLong: String,
    descShort: String,
    mainImageURL: String,
    galleryImageURL: [String],
    variation: [{
        sku: String,
        option: [{
            label: String,
            value: String,
        }],
        inventory: [{
            name: String,
            quantity: Number,
            country: String
        }],
        inStock: Boolean,
        price: mongoose.Types.Decimal128
    }],
    attribute: [{
        label: String,
        value: [String]
    }],
    inStock: Boolean,
    currencySymbol: String,
    slug: String,
    metaTitle: String,
    metaDescription: String,
    relatedAccessory: [Number],
    htmlContentBefore: String,
    htmlContentAfter: String
});

以下是邮递员的产品对象:

{
    "category": [],
    "galleryImageURL": [
        "TEST.png"
    ],
    "relatedAccessory": [],
    "_id": "5feae4418d686300176dfbbd",
    "productId": 1,
    "language": "en",
    "name": "TEST PRODUCT",
    "descLong": "<p><strong>This is a long description</strong></p>",
    "descShort": "Short Description",
    "mainImageURL": "TEST.png",
    "variation": [
        {
            "option": [
                {
                    "_id": "5feae4418d686300176dfbbf",
                    "label": "Color",
                    "value": "Black"
                }
            ],
            "inventory": [],
            "_id": "5feae4418d686300176dfbbe",
            "sku": "P-1",
            "inStock": true,
            "price": "45"
        },
        {
            "option": [
                {
                    "_id": "5feae4418d686300176dfbc1",
                    "label": "Color",
                    "value": "White"
                }
            ],
            "inventory": [],
            "_id": "5feae4418d686300176dfbc0",
            "sku": "P-2",
            "inStock": true,
            "price": "45"
        }
    ],
    "attribute": [
        {
            "value": [
                "Black",
                "White"
            ],
            "_id": "5feae4418d686300176dfbc2",
            "label": "Color"
        }
    ],
    "currencySymbol": "£",
    "slug": "test",
    "metaTitle": "testmeta",
    "metaDescription": "This is meta description",
    "__v": 0
}

以下是API函数:

app.get('/API/Product/GetProductVariationPrice/:productVariationSKU', async(req, res) => {
  try{
    res.send(await Product.findOne({'variation.sku': req.params.productVariationSKU },{'_id': 0, variation :1}));
  } catch (err) {
    res.status(500).send(err);
  }
});

邮递员返回的结果:

{
    "variation": [
        {
            "price": "45"
        },
        {
            "price": "45"
        }
    ]
}

问题:我如何只获得变型SKU“ P-1”的“ 45”?结果,当前还返回变体“ P-2”的价格,这是不需要的。SKU应该基于传递给API的参数。

土生的

通常,当我们从对象数组投影特定字段时,它将返回对象数组,

从MongoDB 4.4开始,作为使find投影与聚合$project阶段保持一致的一部分

  • $reduce迭代variation数组循环,检查条件是否sku匹配,然后返回price
await Product.findOne(
{ "variation.sku": req.params.productVariationSKU },
{
  "_id": 0,
  variation: {
    $reduce: {
      input: "$variation",
      initialValue: 0,
      in: {
        $cond: [
          { $eq: ["$$this.sku", req.params.productVariationSKU] },
          "$$this.price",
          "$$value"
        ]
      }
    }
  }
})

操场


MongoDB 4.4或以下版本请尝试aggregate()

let p = Product.aggregate();
p.match({ "variation.sku": req.params.productVariationSKU });
p.project({
    _id: 0,
    variation: {
        $reduce: {
            input: "$variation",
            initialValue: 0,
            in: {
                $cond: [
                    { $eq: ["$$this.sku", req.params.productVariationSKU] },
                    "$$this.price",
                    "$$value"
                ]
            }
        }
    }
});
res.send(await p.exec());

操场

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何通过猫鼬查询返回嵌入式文档的过滤结果

来自分类Dev

用猫鼬查询嵌套文档

来自分类Dev

用猫鼬查询嵌套文档

来自分类Dev

如何使用猫鼬将查询结果返回到变量

来自分类Dev

如何使用猫鼬将查询结果返回到变量

来自分类Dev

猫鼬查询返回多个结果

来自分类Dev

猫鼬嵌套查询

来自分类Dev

如何从猫鼬查询返回值

来自分类Dev

如何查询猫鼬的返回值

来自分类Dev

猫鼬findOneAndUpdate嵌套文档

来自分类Dev

如何计算猫鼬查询返回的文档所使用的磁盘空间(字节)?

来自分类Dev

如何对猫鼬查询中返回的每个文档执行异步方法

来自分类Dev

如何通过查询子文档找到猫鼬文档?

来自分类Dev

如何通过查询子文档找到猫鼬文档?

来自分类Dev

查询猫鼬子文档

来自分类Dev

猫鼬地理查询未返回正确的结果

来自分类Dev

将查找查询中的结果猫鼬返回给变量

来自分类Dev

通过多种方法返回猫鼬查询结果

来自分类Dev

猫鼬如何通过findOne在文档中获取嵌套对象

来自分类Dev

如何从深层嵌套文档(猫鼬)中拉出

来自分类Dev

猫鼬查询嵌套模式

来自分类Dev

访问猫鼬查询结果

来自分类Dev

猫鼬返回重复的结果

来自分类Dev

猫鼬返回多个结果

来自分类Dev

猫鼬返回重复的结果

来自分类Dev

如何编写猫鼬查询来过滤子文档

来自分类Dev

猫鼬:如何使用.find()返回非Cursor文档

来自分类Dev

如何在猫鼬中查询嵌套数组

来自分类Dev

如何在猫鼬模型中查询嵌套数据