MongoDb从一个数组中选择对象属性与coondition匹配的对象

时间:2015-08-06 19:46:57

标签: arrays node.js mongodb mongoose

我对mongoose和nodejs相对较新。我试图在nodejs中编写一个快速的服务器端脚本。

我尝试使用mongoose从mongoDb中检索数据作为对象数组。

这是我的架构的样子 -

var heatmapSchema = new Schema({
vuid: String
coordinates: [
    {
        x: Number,
        y: Number,
        c: Number,
        timestamp: Number
    }
  ]
}, {collection: collectionName} );

正如您所看到的,coordinates是一个对象数组。我想查询mongoDb,以便得到这些坐标对象的数组,其中c = 1c中的coordinate属性等于1)即 -

[
   {
      x: 100,
      y: 230,
      c: 1,
      timestamp: 1233312312
   },
   {
      x: 120,
      y: 240,
      c: 1,
      t: 1233313425
   }
   ......
]

在猫鼬中实现这一目标的最佳途径是什么?

更新

我到目前为止最接近的是使用以下查询 -

heatmapModel.aggregate(
[
    {
        $unwind: '$coordinates'
    },
    {
        $match: {
            'coordinates.c': 1
        }
    },
    {
        $project: {
            '_id': 0,
            'coordinates.x': 1,
            'coordinates.y': 1,
            'coordinates.c': 1,
            'coordinates.timestamp': 1
        }
    }
],
function (err, result) {

    if (err) {
        console.log(err);
        process.exit(1);
    }

    console.log(result);
    process.exit();
}
);

这给了我以下输出 -

[ { coordinates: { x: 601, y: 165, c: 1, timestamp: 1438840800424 } },
  { coordinates: { x: 484, y: 192, c: 1, timestamp: 1438840801211 } },
  { coordinates: { x: 484, y: 192, c: 1, timestamp: 1438840801388 } },
  { coordinates: { x: 414, y: 394, c: 1, timestamp: 1438840802378 } },
  .....
]

如何摆脱json中不需要的coordinates键?

1 个答案:

答案 0 :(得分:1)

heatMap.find({' coordinates.c':1});应该工作。