使用变量访问MongoDB嵌套对象

时间:2017-05-21 21:37:26

标签: javascript node.js mongodb ecmascript-6 mongojs

使用npm包mongojs,我需要使用变量访问嵌套对象。但是,以下内容不起作用:

    let userID = req.user._id,
        marketName = req.body.marketName,
        itemName = req.body.item.itemName,
        crossOff = req.body.item.isCrossed;

    markets.updateOne(
       {
        _id: userID,
        "marketList.marketName": marketName
      },
      {$set : {`marketList.$.shoppingList.${itemName}.isCrossed`: crossOff}},
      (err, doc) => {
        if(err) { res.status(400).send('Bad Request') }
        else { res.status(204) }
        res.end();
      });
   });

由于在这种情况下无法使用模板字符串,因此unexpected template string错误
我知道可以使用括号表示法将变量用作键,但是,这对我的情况没有帮助,因为我无法将整个键存储在其中的变量设置为字符串。

为了提供帮助,以下是文档结构的示例:

{
  _id: ObjectId(...),
  marketList: [
    { marketName: 'ralphs',
      shoppingList: {
        "cookies": {  itemName: "cookies", isCrossed: false },
        "moar cookies": { itemName: "moar cookies", isCrossed: true }
    },
    {
      marketName: 'gelsons',
      shoppingList: {
        "even moar cookies": { itemName: "even moar cookies", isCrossed: true }
      }
    }
  ]
}

我有什么选择?

1 个答案:

答案 0 :(得分:0)

您可以提前创建查询,这样括号表示法可用于键

let userID   = req.user._id,
  marketName = req.body.marketName,
  itemName   = req.body.item.itemName,
  crossOff   = req.body.item.isCrossed,
  query      = {};

query["marketList.$.shoppingList." + itemName + ".isCrossed"] = crossOff;

markets.updateOne({
        _id: userID,
        "marketList.marketName": marketName
    }, {
        $set: query
    }, (err, doc) => {
        if (err) {
        res.status(400).send('Bad Request');
        } else {
        res.status(204);
        }
        res.end();
    });
});