【问题标题】:Getting an element from subdocument in mongodb从 mongodb 的子文档中获取元素
【发布时间】:2021-12-16 23:24:05
【问题描述】:

我想从 MongoDB 的数组子文档中检索一个元素。

这是我当前的文档

  _id: new ObjectId("6175d614c5a8d65745253aca"),
  fullname: "I'm Admin",
  password: '$2b$10$MNsk4ODki0bdSpliKthdb.0KGvy4xkBxxeadfg2TnQAZf810SQ.3q',
  mobile: '88888888',
  email: 'admin@gmail.com',
  accountBalance: 979000,
  __v: 0,
  tradeTransactions: [
    {
      transactionId: 2021-11-02T00:55:52.268Z,
      itemName: 'banana',
      purchasePrice: 1,
      purchaseAmount: 8000
    },
    {
      transactionId: 123,
      itemName: 'apple',
      purchasePrice: 2,
      purchaseAmount: 5000
    }
  ]
}

我希望能够得到

    {
      transactionId: 2021-11-02T00:55:52.268Z,
      itemName: 'banana',
      purchasePrice: 1,
      purchaseAmount: 8000
    }

我尝试使用,但它没有给我想要的结果。

const test = user.findOne({"tradeTransactions.transactionId" : "2021-11-02T00:55:52.268Z"}, {"tradeTransactions.$" : 1, "transactionId" : 0})

我也试过了,但它给了我一堆未定义的

user.find({
            "tradeTransactions": {
              $elemMatch: {"transactionId": "123"}
            }
          },
          {"tradeTransactions.$": 1})   

我能得到一些指导吗?

非常感谢。

【问题讨论】:

    标签: javascript node.js mongodb subdocument


    【解决方案1】:

    尝试聚合https://mongoplayground.net/p/dDUJO944DIP

    user.collection.aggregate([
      { $match: { _id: ObjectId("6175d614c5a8d65745253aca") } },
      { $unwind: "$tradeTransactions" },
      { $match: { "tradeTransactions.transactionId": "2021-11-02T00:55:52.268Z" } },
      { $replaceRoot: { newRoot: "$tradeTransactions" } }
      ])
    

    【讨论】:

    • 感谢您的回复,我尝试了您提供的链接上的代码,它工作正常,但它没有给我在 VSCode 中想要的东西。我试过const response = await user.findOne({"tradeTransactions.transactionId" : transactionID},{'tradeTransactions':currentPrice}).lean(); 并且它有点工作。
    • 试试这个:const query = user.collection.aggregate([ { $match: { _id: ObjectId("6175d614c5a8d65745253aca") } }, { $unwind: "$tradeTransactions" }, { $match: { "tradeTransactions.transactionId": "2021-11-02T00:55:52.268Z" } }, { $replaceRoot: { newRoot: "$tradeTransactions" } } ]); const result = await query.toArray(); 结果应该是你的对象的数组
    • 非常感谢。这正是我想要的项目。
    【解决方案2】:

    你应该像这样在$project中使用$filter

    db.collection.aggregate([
      {
        "$project": {
          _id: 0,
          tradeTransactions: {
            "$filter": {
              "input": "$tradeTransactions",
              "as": "t",
              "cond": {
                $eq: [
                  "$$t.transactionId",
                  "2021-11-02T00:55:52.268Z"
                ]
              }
            }
          }
        }
      }
    ])
    

    https://mongoplayground.net/p/bUACdhesUI8

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      • 2014-02-02
      • 2014-11-12
      • 2016-02-01
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多