【问题标题】:Mongoose aggregate match and addfield with provided list indexMongoose 聚合匹配和 addfield 与提供的列表索引
【发布时间】:2019-05-21 15:22:53
【问题描述】:

我需要根据我传入的数组的索引来更新文档的字段顺序。但是当我调用这个API时,最终结果是[],并且数据库中没有预期的变化。需要你的建议

我传入的数组是:

["5c1b9f2b66922a77ec7116a1", "5c1b9d4a66922b77ec81169f"]

exports.update_item_order = (req, res, next) => {
      const idList = req.body.idList;
      if (!idList) {
        res.status(400).json({
          message: "Missing request paramaters"
        });
      }
      vouchers.aggregate([{
        "$match": {
          "_id": {
            "$in": idList
          }
        }
      }, {
        "$addFields": {
          "order": {
            "$indexOfArray": [idList, "$_id"]
          }
        }
      }, {
        "$sort": {
          "order": 1
        }
      }]).exec((err, result) => {
        if (err) {
          return res.status(500).json();
        }
        return res.status(200).json({
          message: 'Status update successfully',
          result
        })
      })
    };

我从中检索的样本集合

【问题讨论】:

标签: mongodb mongoose aggregation-framework


【解决方案1】:

您需要遍历ids数组并将它们转换为猫鼬ObjectId

import mongoose from 'mongoose'

const ids = ["5c1b9f2b66922a77ec7116a1", "5c1b9d4a66922b77ec81169f"].map(id => mongoose.Types.ObjectId(id))

vouchers.aggregate([
  { "$match": { "_id": { "$in": ids }}},
  { "$addFields": {
    "order": {
      "$indexOfArray": [ids, "$_id"]
    }
  }},
  { "$sort": { "order": 1 }}
])

【讨论】:

  • 非常感谢您的方法,它工作得很好,我现在正在研究如何将数组索引分配给数据库字段的其余部分:) 我会支持它,因为它解决了部分问题:) 谢谢
  • 更新了我的答案
  • 我有一个关于 MongoDB 聚合和 mongoose 聚合的问题,它们是否都共享相同的关键字,如 $addFields 或 $addToSet,因为我似乎找不到任何关于 mongoose 的文档,说明它们支持这些关键字。
  • Mongoose 是 mongodb 的对象建模工具。 Mongoose 具有与 mongodb 相同的查询和功能。你可以参考猫鼬文档here。与 mongodb 相比没有什么区别
  • 谢谢,你拯救了我的一天。我看到了我的结果,并且正确分配了字段。但是在我刷新我的 MongoDB 之后,我的文档那里没有“订单”字段。但我会将此标记为答案,因为它是解决查询。 :) 谢谢顺便说一句,在从每个“$xxx”关键字中删除双引号后,我设法让您的代码正常工作。也许您可以更新它,以便其他人可以得到正确的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 2020-02-23
  • 2016-10-14
  • 2016-07-11
相关资源
最近更新 更多