我很难说出这个问题,这可能就是为什么我没有找到已经发布的解决方案的原因。
我正在使用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的商品数组中尚未包含该产品,因此它将被推送到商品数组中。
结果看起来像这样:
_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
}
]
我希望这是有道理的。就像我说的那样,我很难提出一个好的Google搜索用语。
修改: 现在,我在想,我的下一个选择是按ID查找列表,对它们进行突变,然后将更新推送到后端的集合中。这似乎是一种有效的可行选择吗?
答案 0 :(得分:0)
我不确定是否有一种方法可以按照您所描述的方式进行update
,但是解决此问题的一种方法是将productIds
和productCounts
分为两个单独的字段,以便您可以使用$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"
]
}
>