1

下面是使用 mongojs 管理数据库的 MERN 应用程序的快速路由的代码片段。为了正确存储数据,我有一个名为“shows”的集合,它由 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);
    })
});

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

节目 -> 观看 -> [{"showid": "..."}, {"showtitle":"..."}] 等。

如果可能的话,只是寻找一种更简单的扩展方式。

提前非常感谢!

4

1 回答 1

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 代码中组合在一起。

于 2018-05-03T22:52:32.717 回答