2017-10-14 55 views
0

我是nodejs的新手,目前我正在使用nodejs,express和mongoose开发Web API。任何人都可以帮我关注猫鼬查询。Nodejs Mongoose选择整个文档,但仅限于属性数组中的选定项目

var EventSchema = new Schema({ 

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

     service_order: [{ 
        _id:{ 
        type: String 
        }, 
        service : { 
         type: Schema.Types.ObjectId, 
         ref: "Service" 
        } 

     }]  
}); 

我要选择整个事件的文件,但只与数组中选择service_order项目

例如: - 这是整个事件的文件

{ 
    _id: "sample_id", 
    name: 'some name', 
    "service_order": [ 
         { 
         "_id": "1" 
         "service": { 
            "_id": "59c005524d9c141fe0d95f15" 
         }, 
         { 
         "_id": "2" 
         "service": { 
            "_id": "59c005524d9c141fe0d95f18" 
         }, 
         { 
         "_id": "3" 
         "service": { 
            "_id": "59c005524d9c141fe0d95f18" 
         }, 
         { 
         "_id": "4" 
         "service": { 
            "_id": "59c005524d9c141fe0d95f18" 
         } 
        ], 
} 

但我想执行一个单一的猫鼬查询,可以给这个作为输出

{ 
     _id: "sample_id", 
     name: 'some name', 
     "service_order": [ 
          { 
          "_id": "1" 
          "service": { 
             "_id": "59c005524d9c141fe0d95f15" 
          }, 
          { 
          "_id": "2" 
          "service": { 
             "_id": "59c005524d9c141fe0d95f18" 
          } 
         ], 
    } 

最初我知道事件ID(“sample_id”)和我想要选择的service_orders的ID([“1”,“2”])。

回答

0

您可以使用MongoDB的聚合来实现这一

不要忘记你的动态数据替换sample_id["1" , "2"]

检查下面的代码:

db.event.aggregate([ 
    { 
     $match: { _id: "sample_id" } 
    }, 
    { 
     $unwind: { path: "$service_order" } 
    }, 
    { 
     $match : { 'service_order._id' : { $in : [ "1" , "2"]} } 
    }, 
    { 
     $group : { 
      _id: { _id: "$_id", "name": "$name"}, 
      service_order: { $addToSet: "$service_order" }, 
     } 
    }, 
    { 
     $project : { 
      _id : "$_id._id", 
      name : "$_id.name", 
      service_order : 1 
     } 
    } 
]) 
相关问题