Javascript 在投影字段中使用$elemMatch-未按需要进行筛选

Javascript 在投影字段中使用$elemMatch-未按需要进行筛选,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,此模式: var Order = new Schema({ name: String, products: [{ product: { type: Schema.Types.ObjectId, ref: "Product" }, qty: Number }] }); 我想查找并返回订单,但仅返回具有匹配id的产品。我尝试$elemMatch未成功,似乎返回了所有产品的整个订单。我可以使用position操作符($),但在本例中,我希望特

此模式:

var Order = new Schema({
  name: String,
  products: [{
    product: {
     type: Schema.Types.ObjectId,
     ref: "Product"
    },
    qty: Number
  }]
 });
我想查找并返回订单,但仅返回具有匹配id的产品。我尝试$elemMatch未成功,似乎返回了所有产品的整个订单。我可以使用position操作符($),但在本例中,我希望特别使用$elemMatch

请注意,订单中的每个产品都是唯一的(在该订单中)

这将返回所有产品:

Order.find({ _id: req.params.id}, { 'products.product': {$elemMatch: { _id: req.params.product }}}, function(err, order) {
这将返回空值:

Order.find({ _id: req.params.id}, { 'products': {$elemMatch: { 'product._id': req.params.product }}}, function(err, order) {

什么是正确的语法?我希望订单只返回一个(匹配的)产品。

如果订单中的产品始终是唯一的(一个订单中不能有多个相同的产品),则只能使用查询投影。如果同一产品可以在一个顺序中出现多个,则不能使用查询投影,因为它将只返回产品数组中找到的第一个产品

相反,使用聚合。使用$unwind和$match运算符。 在mongo shell javascript中类似于此

db.orders.aggregate([
    {$match: {_id: Order_id_being_search}},
    {$unwind: "$products"}, 
    {$match: {"products.product._id": Product_id_being_search }}
])
它将返回所选订单文档中的所需产品(仅产品)。如果要从所有订单返回所需的产品,只需省略第一个$match

抱歉,我不习惯使用“REF”,因此我假设使用上述代码上的_id键进行手动引用。您可以在代码中修改该部分。你可以使用algo


MongoDB不仅使用聚合查找聚合值,如sum、avg、max等,还使用关系值。它还使用聚合框架来处理子文档。您的案例是聚合框架中$unwind操作用例的完美示例。

products
数组中,
product
字段直接包含产品的id,因此正确的语法为:

Order.find(
    { _id: req.params.id}, 
    { products: {$elemMatch: { product: req.params.product }}}, 
    function(err, order) { ... });

它可以是#code Order.find({u id:req.params.id,'products.product._id':req.params.product},{'products.$':1}}}},function(err,Order){#code。但它只检索最大值(第一个找到的值)产品数组中的产品。如果一个订单包含多个相同的产品,它将只返回一个。唯一的方法是使用聚合。在聚合中使用$unwind操作,然后使用$MATCH。我对我的问题进行了一些重新表述-我确实想返回订单,但我只希望订单中有一个产品。我相信$elemMat根据文档,ch是我所需要的一切,但是..好吧,我的错。很抱歉我把你引向了错误的方向。很高兴你已经得到了答案..这几乎没有返回任何东西。下面是它返回的内容:
[{{u id:007d000b10000000c,products:[]]
请稍候……我对每个产品都有两个ID—一个是“产品”的ID,另一个是Mongo分配给“产品”下对象的ID—我可能会把它们弄混了