Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用变量访问MongoDB嵌套对象_Javascript_Node.js_Mongodb_Ecmascript 6_Mongojs - Fatal编程技术网

Javascript 使用变量访问MongoDB嵌套对象

Javascript 使用变量访问MongoDB嵌套对象,javascript,node.js,mongodb,ecmascript-6,mongojs,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: use

使用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();
      });
   });
由于在这种情况下不能使用模板字符串,因此出现了
意外的模板字符串
错误。

我知道可以使用括号表示法将变量用作键,但是,这对我的情况没有帮助,因为我无法将整个键作为字符串存储在变量中。

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

{
  _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 }
      }
    }
  ]
}

我的选项是什么?

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

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();
    });
});

为什么不能创建一个对象并使用括号作为键?模板字符串只是语法上的糖,如果你能使用它们,你可以使用一个对象。@adeneo我事先不知道marketName的位置是什么。否则我只会使用括号符号,就像->一样,我会被诅咒的。谢谢@adeneo我不知道我可以用这种方式设置查询。不客气,我也添加了它作为答案。