在Mongodb + Mongoose.js中动态查询嵌套对象

pro*_*ype 2 javascript mongoose mongodb node.js

我如何在Mongoose.js + MongoDB中执行此查询?

我有一个简单的架构,其中评级由用户ID存储,以避免重复.对于读取和写入给定对象,这很好.但是,我如何向MongoDB查询特定查看者对其进行评级的所有项目?

例如,这在MongoDB shell中工作正常:

db.items.find({ratings.52126672b9f5bd670b000001: {$exists: true}})
Run Code Online (Sandbox Code Playgroud)

但我想在Node.js + Mongoose.js中以编程方式查询,如下所示,

var user_id = req.params.id;
Item.find({ ratings.user_id : {$exists: true}}, function(err, items) { ... });
Run Code Online (Sandbox Code Playgroud)

令我难以接受的是Mongoose.js对内部对象采用点表示法,但是它解释user_id为文字,而Mongoose.js不对内部对象采用方括号表示法.

这是一个示例模式;

var ItemSchema = new mongoose.Schema({
   name:  { type: String, required: true },
   ratings: { type: mongoose.Schema.Types.Mixed} 
});
Run Code Online (Sandbox Code Playgroud)

这样的数据的一个例子:

[ { 
      name: "Toaster", 
      ratings: {
          "52126672b9f5bd670b000001": 1,
          "52155b39a411791c29000001": -1
      }
   }, 
   { 
      name: "Griddle", 
      ratings: {
          "52126672b9f5bd670b000001": 1,
          "52126672b9f5bd670b000001": 1"
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

And*_*ren 8

var user_id = req.params.id;
var query = {};
query['ratings.' + user_id] = {$exists: true};
Item.find(query, function(err, items) { ... });
Run Code Online (Sandbox Code Playgroud)

您发送给Item.find的对象中的键必须是一个字符串.要构造任意值的字符串,您必须首先创建对象,然后使用括号表示法来定义它(即:)query[anything+here] = data.