node.js - Mongoose 查询以增加项目数组中的字段(如果存在),否则将其添加到文档中(很难表述此标题)

标签 node.js mongodb mongoose

我很难措辞这个问题,这可能就是为什么我没有找到已经发布的解决方案的原因。

我正在使用 mongoose 和 NodeJS 查询 mongoDB 集合。

我正在查询的列表集合的结构如下所示:


    _id: ObjectId("1"),
    listName: "List 1",
    items: [
        {
           productId: ObjectId("11"),
           quantity: 2
        }
    ]

    _id: ObjectId("2"),
    listName: "List 2",
    items: [
        {
           productId: ObjectId("22"),
           quantity: 4
        }
    ]


我想使用列表 id 数组查询列表集合。该查询还包含一个productInfo 字段,如下所示:

   listIdsToQuery: [ObjectId("1"), ObjectId("2)],
   productInfo: {
       productId: ObjectId("11"),
       quantity: 2
   }

如果 ProductId 尚未出现在某个列表中,那么我只需将产品添加到 items 数组中。这是简单的部分,我已经记下来了。

我遇到的问题是,如果产品已经在列表中,那么我只想将产品的当前数量增加到我传递的数量。

上面的例子:

  • 列表 1 的 items 数组中已包含该产品,因此我将该数量增加 2

  • 列表 2 的 items 数组中尚未包含该产品,因此它只会被插入 items 数组中。

    结果如下:


    _id: ObjectId("1"),
    listName: "List 1",
    items: [
        {
           productId: ObjectId("11"),
           quantity: 4
        }
    ]

    _id: ObjectId("2"),
    listName: "List 2",
    items: [
        {
           productId: ObjectId("22"),
           quantity: 4
        },
        {
           productId: ObjectId("22"),
           quantity: 4
        }
    ]

我希望这是有道理的。就像我说的,我很难想出一个好的谷歌搜索措辞。

编辑: 现在我在想我的下一个选择是通过 id 查找列表,对它们进行变异,然后将更新推送到后端的集合。这看起来是一个有效可行的选择吗?

最佳答案

我不确定是否有办法按照您所描述的方式进行更新,但解决此问题的一种方法可能是将productIdsproductCounts 到两个单独的字段中,以便您可以使用 $addToSet$inc 运算符来执行操作: { $addToSet: { ProductIds: ObjectId("22") }, $inc: { ["productCounts.22"]: 1 } }.

以下是一些更新示例:

> db.test_coll.findOneAndUpdate({a: 1}, { $addToSet: { productIds: "22" }, $inc: { ["productCounts.22"]: 1 } }, {returnNewDocument: true});
{
    "_id" : ObjectId("5c6b6714f5b3e45884d12630"),
    "a" : 1,
    "productCounts" : {
        "22" : 4
    },
    "productIds" : [
        "22"
    ]
}
> db.test_coll.findOneAndUpdate({a: 1}, { $addToSet: { productIds: "23" }, $inc: { ["productCounts.23"]: 1 } }, {returnNewDocument: true});
{
    "_id" : ObjectId("5c6b6714f5b3e45884d12630"),
    "a" : 1,
    "productCounts" : {
        "22" : 4,
        "23" : 1
    },
    "productIds" : [
        "22",
        "23"
    ]
}
> 

关于node.js - Mongoose 查询以增加项目数组中的字段(如果存在),否则将其添加到文档中(很难表述此标题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54757177/

相关文章:

node.js - 如何使用nodejs和express设置授权 header

node.js - Meanjs:generator 错误: [$injector:unpr] 未知提供者: MenusProvider <- Menus

mongodb - 将 MongoDB 从 root 更改为 Sudo 用户

javascript - Mongodb 聚合以对数组中最常见的项目进行排序?

python - 有时我的 pg_restore 或 mongorestore 会卡住

mongodb - 我可以从 MongoDB 时间戳中获得更大的粒度吗?

node.js - 返回类中的中间件

node.js - 什么是 TickObject 以及如何防止它成为内存泄漏?

mongodb - Mongo - 如何在单个查询中更新具有不同值的多个文档?

node.js - JSON 数组的异步迭代