使用Mongoose返回特定字段

5

我试图完成一些非常简单的事情,但仍然失败了。

我想要做的是,在我的服务器上收到一个get请求时返回所有文档,但只填充特定的字段。

我的架构如下:

var clientSchema = new Schema({
    name:{
        type: String,
        required: true
    },
    phone:{
        type: String,
        required: true
    },
    email:{
        type: String,
        required: true
    },
    address: {
        type: String,
        required: false
    }
});

var orderDetailsSchema = new Schema({
    //isn't added to frontend
   confirmed:{
       type: Boolean,
       required: true,
       default: false
   },    
   service:{
       type: String,
       required: true
   },
   delivery:{
       type: String,
       required: false
   },
    payment:{
        type: String,
        required: false
    },
    status:{
        type: String,
        required: true,
        default: "new order"
    },
});

var orderSchema = new Schema({

   reference:{
       type: String,
       required: true
   },

    orderdetails: orderDetailsSchema,

    client: clientSchema,

    wheelspec: [wheelSchema],

    invoice:{
        type: Schema.Types.ObjectId,
        ref: 'Invoice'
    }


});

我想要的是只返回client.phoneclient.email,并且包括orderdetails.status字段,如果可能的话,还要保留reference字段。

我已经尝试使用lean()populate(),但是都没有成功。我是否漏掉了非常简单的事情?或者我想要实现的不是那么容易?谢谢!


1
你的get调用是什么样子?您可以使用MongoDB投影。 - Atish
需要查看您当前的查询。 - Alex
3个回答

9
您可以像这样指定要返回的字段:
Order.findOne({'_id' : id})
        .select('client.phone client.email orderdetails.status reference')
        .exec(function(err, order) {
        //
});

替代语法

Order.findOne({'_id' : id})
    .select('client.phone client.email orderdetails.status reference')
    .exec(function(err, order) {
      //
});

我在这里做了许多假设,但是您应该能够看到这个想法。


1
完全按照我的要求工作。谢谢! - Jack Wolther
我正在学习使用Node,并且正在使用TypeScript的Nest框架。当我使用过滤器进行查询并返回特定字段(类似于Java)时,是否有必要(最佳实践)将结果映射到DTO中? - Hector

4

只需按照以下方式操作:

Order是在mongoose中注册的模型名称。

Order.findById(id) // set id you have to get 
   . populate('client')
    .select('client.phone client.email orderdetails.status reference')
    .exec(function(err, order) {
      //
});

1
你可以使用投影。
await Order.findById(diaryId, {phone: 1, email: 1, status: 1})

如果将phone:1设置为1,则包括在内,如果phone:0,则排除在外。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接