使用变量访问 MongoDB 嵌套对象

Access MongoDB nested object using variables

使用 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 }
      }
    }
  ]
}

我有哪些选择?

您可以预先创建查询,这样就可以使用括号符号作为键

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