2017-02-14 48 views
1

我有这条路径用于搜索orderId的部分用户输入。Mongoose:如何查询填充内的对象?

ordersAdminRouter.route('/searchorder/:term') 
    .get(function(req, res){ 
     term = req.params.term; 
     console.log(term); 
     Orders.find({orderId: new RegExp(term)}) 
      .populate({ path: 'userPurchased products.product', select: '-username -password' }) 
      .exec(function(err, orders){ 
       if (err) throw err; 
       console.log(orders); 

       res.json(orders); 
      }); 
    }); 

这里是我的架构

var orderSchema = new Schema({ 
    orderId: { type: String }, 
    userPurchased: { type: Schema.Types.ObjectId, ref: 'users' }, 
    products: [ 
     { 
      product: { type: Schema.Types.ObjectId, ref: 'products' }, 
      size: { type: String, required: true }, 
      quantity: { type: Number, required: true }, 
      subTotal: { type: Number, required: true } 
     } 
    ], 
    totalQuantity: { type: Number }, 
    totalPrice: { type: Number }, 
    modeOfPayment: { type: String }, 
    shippingAd: { type: String }, 
    refNumber: { type: String }, 
    isDone: { type: Boolean, default: false }, 
    orderStatus: { type: String, default: 'Pending' }, 
    dateOrdered: { type: Date, default: Date.now() }, 
    fromNow: { type: String } 
}); 

现在我需要寻找内userPurchased名字和姓氏时,我填充我只得到。如何搜索它?

+0

@ThomasBormans我认为方法是不是很好的表现明智的。我需要获取db上的所有内容,然后每隔400ms进行一次过滤,这是我的搜索输入实现。我的订单数据库非常大,因此有时需要10secs,因为base64编码的图像。那么如果没有其他办法,那么我没有选择。 –

+0

你是绝对正确的,但问题是相同的(我认为)。这就是我将其标记为重复的原因。 –

回答

0

我无法理解您在'userPurchased'字段中保存的是什么类型的信息。我假设用户处于不同的集合中,并且您只会将用户的用户ID保留在用户购买的用户中。如果你是刚刚放置的ID,您可以搜索使用下面的查询:

orderSchema.find({userPurchased : 'id'}) 

如果你把带有字段的对象,没有任何神秘感。只需使用.运营商。例如:

orderSchema.find({userPurchased.firstName : 'name'}) 

希望它可以帮助你

+0

你的第一个陈述是真实的。 userPurchased只是一个基于我的模式的ID。我正在寻找userPurchased.firstname,但这些字段只会在.populate方法之后存在。这意味着我不能使用orderSchema.find({userPurchased.firstname:'name'}),因为userPurchased只是一个ID BEFORE .populate –

+0

我明白了,对不起,如果我的回答不是你要找的。当你说要搜索名字时,这意味着你想在第一次搜索后执行第二次搜索,对吧? –

+0

我试图找到的是在find()上的第一条语句上进行搜索,以便减少返回文档的大小。 –