【问题标题】:Mongoose: Populating object's nested array with projectionMongoose:使用投影填充对象嵌套数组
【发布时间】:2017-01-01 12:33:11
【问题描述】:
var CarSchema = new Schema({
    name: {type: String},
    partIds: [{type: Schema.Types.ObjectId, ref: 'Part'}],
});

var PartSchema = new Schema({
    name: {type: String},
    props: [
        { colour: {type: String}, shape: {type:String} }
    ],
});

例如

Car = {
       name: "BMW",
       partIds:[ObjectId("57baa43e152654f80aac36a6")]}

Part = {
        _id: ObjectId("57baa43e152654f80aac36a6"),
        name: "Piston",
        props: [{colour:"red", shape: "Cubical"},{colour:"green", shape: "cylindrical"}]

所以当我查询时,我应该得到这样的文档:

Car = {
      name: "BMW",
      partIds: [{ 
_id:ObjectId("57baa43e152654f80aac36a6"), name:"Piston", props: [{colour:"red", shape:"cubical"}]
     }

props 数组应该只有红色的元素

我想用 Part Array 填充 Car,这样它的 prop 数组就只有红色的对象。有没有办法做到这一点,或者我必须采用老式的方式并循环通过 props 数组匹配其颜色与红色。

【问题讨论】:

  • 您是否已经拥有part 收藏?还是您创建它并将其 id 存储在 car Collection 中?
  • 零件集合不同,其ID存储在汽车集合的partIds中
  • 所以如果颜色是红色,你想创建part 文档并将其id 存储在car 集合中?
  • 不,我想查询 Car 集合,以便它填充 partIds,这样 props aray 只有颜色为红色的元素。
  • 添加了示例文档

标签: node.js mongodb mongoose mongoose-populate


【解决方案1】:

你可以试试这个,它应该会得到你想要的。

car.find({"partIds.props.colour" : "red"})
    .populate('partIds')
    .exec(function(err,result){...});

【讨论】:

    【解决方案2】:

    您可以通过在您的populate 调用中提供select 选项来做到这一点:

    Car.findOne()
        .populate({
            path: 'partIds',
            select: { props: { $elemMatch: { colour: 'red' } }, name: 1 }
        })
        .exec(callback);
    

    结果:

    { _id: 57c085451cd8dfcdf814f640,
        name: 'BMW',
        partIds:
         [ { _id: 57baa43e152654f80aac36a6,
             name: 'Piston',
             props: [ { colour: 'red', shape: 'Cubical' } ] } ] }
    

    select 使用$elemMatch 投影运算符仅选择红色的props 元素。

    【讨论】:

      猜你喜欢
      • 2017-10-03
      • 2019-09-23
      • 2018-06-07
      • 2015-03-26
      • 1970-01-01
      • 2020-06-07
      • 2022-11-10
      • 2019-12-06
      相关资源
      最近更新 更多