最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

Mongoose查询增加项目数组中的字段(如果存在),否则将其添加到文档中(很难写出此标题)

IT培训 admin 5浏览 0评论

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


我想用列表数组查询列表集合。该查询还包含产品信息字段,如下所示:

   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查找列表,改变它们然后将更新推送到后端的集合。这似乎是一个有效的可行选择吗?

回答如下:

我不确定是否有办法以你描述的方式做update,但解决这个问题的一种方法是将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"
    ]
}
> 

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


我想用列表数组查询列表集合。该查询还包含产品信息字段,如下所示:

   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查找列表,改变它们然后将更新推送到后端的集合。这似乎是一个有效的可行选择吗?

回答如下:

我不确定是否有办法以你描述的方式做update,但解决这个问题的一种方法是将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"
    ]
}
> 
发布评论

评论列表 (0)

  1. 暂无评论