【问题标题】:Populate last element of an array in Mongoose在 Mongoose 中填充数组的最后一个元素
【发布时间】:2021-05-04 06:29:21
【问题描述】:

我有一个包含数组字段 ("array") 的集合,该字段存储引用另一个集合的 _ids。我正在使用猫鼬的.populate 并且可以使用字符串点表示法填充特定的数组元素,例如

.populate({path: "array.4"})

但我现在想填充数组的最后一个元素。在理想的世界中,"array.-1" 会起作用,但它不会。我尝试过使用 populate 的 match 属性,例如:

.populate({
  path: "array",
  match: { 
    $arrayElemAt: { 
      $subtract: [
        { 
          $size: "array"
        },
        1
      ]
    }
  },
})

但这也不起作用(而且我认为它根本不应该被使用!)

有什么办法可以做到吗?

【问题讨论】:

    标签: javascript mongodb mongoose


    【解决方案1】:

    不确定这是否正是您要查找的内容,但对于特定文档有一种简单的方法可以帮助您为多个文档执行此操作。假设您的文档名称是User,存储这些ObjectId 的数组字段是hobbies。因此示例文档可能如下所示:

      {
        "_id": ObjectId("5a934e000102030405000000"),
        "hobbies": [
          ObjectId("5a934e000102030405000001"),
          ObjectId("5a934e000102030405000002")
        ],
        "name": "James"
      }
    

    您可以为 特定 用户填充 hobbies 数组的最后一个元素:

        User.findById('5a934e000102030405000000')
            .then(user => {
                user.populate(`hobbies.${user.hobbies.length - 1}`, (err, u) => {
                    console.log(u);
                });
            })
    

    如果您有多个要填充的文档,我会这样做,充分意识到根据您拥有的文档数量,这会很耗时:

        User.find()
            .then(users => {
                const promises = users.map(user =>
                    user.populate(`hobbies.${user.hobbies.length - 1}`).execPopulate()
                )
                Promise.all(promises).then(pop => {
                    console.log(pop); //All populated with only last element of hobbies array
                })
            })
    

    【讨论】:

      【解决方案2】:

      试试这个。

      User.find({},{"arrayObject": {$slice: -1})
        .populate('arrayObject')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-28
        • 2023-01-31
        • 2019-01-03
        • 2019-08-26
        • 1970-01-01
        • 2019-02-09
        相关资源
        最近更新 更多