我正在为我正在建设的网站设计项目库存系统。
用户的广告资源是从Web API加载的。然后处理此信息,使其更适合我的Web应用程序。我试图将所有项目记录合并到一个MongoDB集合中 - 因此其他用户库存将缓存在同一个地方。我必须处理的是删除旧项目记录(如果它们从用户的库存中丢失(即他们将其出售给某人)并且还插入新项目)。请注意我已查看有关批量upserts的几个Stack Overflow问题,但我无法找到有关条件更新的任何内容。
每个项目都有两个唯一标识符(classId
和instanceId
),这些标识符允许我查找它们(我必须使用两个ID来匹配它),这些标识符保持不变。有关该项目的一些信息(例如其名称)可能会发生变化,因此我希望能够在获取新的库存信息时更新这些记录。我还希望将我的网站以前从未见过的新项目添加到我的数据库中。
一旦处理了从Web API返回的数据,它就会留在大量的对象中。这意味着我可以使用批量写入,但是,我不知道如何使用具有多个记录的条件进行upsert。
以下是我的项目架构的一部分:
const ItemSchema = new mongoose.Schema({
ownerId: {
type: String,
required: true
},
classId: {
type: String,
required: true
},
instanceId: {
type: String,
required: true
},
name: {
type: String,
required: true
}
// rest of item attributes...
});
用户库存通常包含600个或更多项目,最大数量为2500.
备份这么多数据的最有效方法是什么?谢谢
我在实现批量插入问题的解决方案时遇到了麻烦。我做了一些假设,我不知道他们是否正确。我将_
解释为lodash,将response.body
解释为API返回的JSON,将myListOfItems
解释为相同的项目数组。
import Item from "../models/item.model";
import _ from 'lodash';
async function storeInventory(items) {
let bulkUpdate = Item.collection.initializeUnorderedBulkOp();
_.forEach(items, (data) => {
if (data !== null) {
let newItem = new Item(data);
bulkUpdate.find({
classId: newItem.classId,
instanceId: newItem.instanceId
}).upsert().updateOne(newItem);
items.push(newItem);
}
});
await bulkUpdate.execute();
}
每当我运行此代码时,它会抛出一个错误,抱怨有_id
字段被更改,当我创建的模式对象没有指定任何与模式有关的东西时,并且几个嵌套的模式对象没有'当我将它们改为对象时,会对结果产生影响。
据我所知,如果没有_id
发送到MongoDB,它会自动生成一个,但是如果它正在更新记录,那么无论如何都不会这样做。我也尝试在每个项目上将_id
设置为null但无效。
我是否误解了接受的答案?或者我的代码中的其他问题是什么?
答案 0 :(得分:3)
我就是这样做的:
let bulkUpdate = MyModel.collection.initializeUnorderedBulkOp();
//myItems is your array of items
_.forEach(myItems, (item) => {
if (item !== null) {
let newItem = new MyModel(item);
bulkUpdate.find({ yyy: newItem.yyy }).upsert().updateOne(newItem);
}
});
await bulkUpdate.execute();
我认为代码非常易读且易于理解。您可以调整它以使其适用于您的情况:)