猫鼬:批量更新但仅在满足特定条件时更新记录
Mongoose: Bulk upsert but only update records if they meet certain criteria
我正在为我正在构建的网站设计项目库存系统。
用户的清单是从 Web API 加载的。然后处理此信息,使其更适合我的网络应用程序。我正在尝试将所有项目记录合并到一个 MongoDB 集合中 - 因此其他用户库存将缓存在同一个地方。我必须处理的是删除旧的项目记录,如果它们从用户的库存中丢失(即他们把它卖给某人)并且还要更新新项目。请注意,我已经查看了几个关于批量更新插入的 Stack Overflow 问题,但我找不到任何关于条件更新的信息。
每个项目都有两个唯一标识符(classId
和 instanceId
),让我可以查找它们(我必须使用两个 ID 来匹配它),它们保持不变。关于该项目的一些信息,例如它的名称,可能会发生变化,因此我希望能够在我获取新的库存信息时更新这些记录。我还希望将我的网站以前从未见过的新项目添加到我的数据库中。
从 Web API 返回的数据经过处理后,会留在大量对象中。这意味着我可以使用批量写入,但是,我不知道如何使用多条记录的条件进行更新。
这是我的项目架构的一部分:
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 但无济于事。
我对接受的答案有什么误解吗?或者我的问题出在我的代码的其他地方?
我是这样做的:
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();
我认为代码非常易读易懂。您可以调整它以使其适合您的情况:)
我正在为我正在构建的网站设计项目库存系统。
用户的清单是从 Web API 加载的。然后处理此信息,使其更适合我的网络应用程序。我正在尝试将所有项目记录合并到一个 MongoDB 集合中 - 因此其他用户库存将缓存在同一个地方。我必须处理的是删除旧的项目记录,如果它们从用户的库存中丢失(即他们把它卖给某人)并且还要更新新项目。请注意,我已经查看了几个关于批量更新插入的 Stack Overflow 问题,但我找不到任何关于条件更新的信息。
每个项目都有两个唯一标识符(classId
和 instanceId
),让我可以查找它们(我必须使用两个 ID 来匹配它),它们保持不变。关于该项目的一些信息,例如它的名称,可能会发生变化,因此我希望能够在我获取新的库存信息时更新这些记录。我还希望将我的网站以前从未见过的新项目添加到我的数据库中。
从 Web API 返回的数据经过处理后,会留在大量对象中。这意味着我可以使用批量写入,但是,我不知道如何使用多条记录的条件进行更新。
这是我的项目架构的一部分:
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 但无济于事。
我对接受的答案有什么误解吗?或者我的问题出在我的代码的其他地方?
我是这样做的:
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();
我认为代码非常易读易懂。您可以调整它以使其适合您的情况:)