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—我可能会把它们弄混了