如何将变量传递给MongoDB查询,它应该是一个属性

时间:2018-04-12 05:13:34

标签: node.js mongodb express properties mern

以下是来自MERN应用程序的快速路由的代码片段,该应用程序使用mongojs来管理数据库。为了正确存储数据,我有一个名为" show"这是由3个子类别(观察,观察和排队)组成,每个子类别由一组对象组成。

显然,3个单独的帖子路由可以完成同样的任务但有一种方法可以修改这个查询,其中" shows.watched"可以传递一个变量而不是在此查询中声明为属性?

我正在思考使用局部变量var something来创建请求" shows.queued"。类似于JSX通过shows.${id}连接或绕过查询中的标准属性请求的能力可以工作但不确定MongoDB中的最佳方法。

app.post('/saveshow/:save', function(req, res) {
var something = "queued";
db.users.findAndModify(
    {query: {_id: mongojs.ObjectId(req.body.userId)},
    update : { $push : { **"shows.watched"** : {showid : 
    req.body.saveId, showtitle : req.body.saveTitle, 
    showimage : req.body.saveImage}}}}, 
function(err, result) {
if (err) throw err;
res.json(result);
    })
});

这将正确地将数据集传递到数据库

显示 - &gt;看了 - &gt; [{&#34; showid&#34;:&#34; ...&#34;},{&#34; showtitle&#34;:&#34; ...&#34;}等等< / p>

如果可能的话,只是寻找一种更容易扩展的方法。

提前非常感谢!

1 个答案:

答案 0 :(得分:0)

如果您首先构建查询的$ push部分,作为javascript对象,您可以动态调整数据的保存位置:

let subcategory = req.subcategory; // e.g. "watched"
let dataChanges = {};
dataChanges[subcategory] = {showid : req.body.saveId, etc};
// dataChanges is now an object structured like this:
// { watched : {showId: 12345} }
db.users.findAndModify(
  {
    query: {_id: mongojs.ObjectId(req.body.userId)},
    update : {$push: {dataChanges} }
   }
) etc.

这是MongoDB的真正优势之一;查询语言json非常容易在javascript代码中组合在一起。