【发布时间】:2014-01-19 13:35:54
【问题描述】:
此架构:
var Order = new Schema({
name: String,
products: [{
product: {
type: Schema.Types.ObjectId,
ref: "Product"
},
qty: Number
}]
});
我想查找并返回仅包含具有匹配 ID 的产品的订单。我在 $elemMatch 的尝试没有成功,并且似乎退回了所有产品的整个订单。我可以使用位置运算符 ($),但在这种情况下我想专门使用 $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) {
什么是正确的语法?我希望退回的订单仅包含一件(匹配的)产品。
【问题讨论】:
-
可能是#code Order.find({ _id: req.params.id,'products.product._id': req.params.product}, { 'products.$' : 1} }}, function(err, order) { #code。但它只检索 products 数组中最大的一个(第一个找到的)产品。如果一个 Order 包含多个相同的产品,它将只返回一个。唯一的方法这样做是通过使用聚合。在聚合中使用 $unwind 操作,然后是 $match
标签: javascript node.js mongodb mongoose