MongoDB: 找出查询数组的元素不在数据库中
MongoDB: find out query array's element not in database
是否可以找出数据库中不存在的查询数组元素?
示例:
const query = ['aaa','bbb','ccc']
数据库中的文件:
[{name:'bbb'},{name:'ccc'}]
我想查找不在数据库中的查询数组元素:
return 结果应该是:
['aaa']
除了查询数组中的每个元素(或批次?)外,我找不到一些快速的方法来执行此操作
谁有更好的方法?谢谢
查询丢失的东西总是一个更昂贵的操作,而且没有“神奇”的查询可以为您完成。我推荐使用 Mongo 的 distinct 方法,像这样:
const queryArr = ['aaa', 'bbb', 'ccc'];
const allNames = await db.collection.distinct('name');
const notInDb = queryArr.filter(e => !allNames.includes(e));
但是,如果您想在 1 db 命令中执行此操作,您可以这样做:
db.collection.aggregate([
{
$group: {
_id: null,
names: {
"$addToSet": "$name"
}
}
},
{
"$replaceRoot": {
"newRoot": {
results: {
$filter: {
input: [
"aaa",
"bbb",
"ccc"
],
as: "datum",
cond: {
$not: {
"$setIsSubset": [
[
"$$datum"
],
"$names"
]
}
}
}
}
}
}
}
])
正如您所知,这两种方法都要求您将所有名称加载到内存中,没有办法解决这个问题,如果您的数据库规模对于这些方法来说太大,您将不得不遍历查询输入并执行此操作一个一个。
const queryArr = ['aaa', 'bbb', 'ccc'];
for (let queryName of queryArr) {
const found = await db.collection.findOne({name: queryName})
if (!found) {
//ding
}
}
假设您在 name
字段上有一个索引,这应该非常有效。
是否可以找出数据库中不存在的查询数组元素?
示例:
const query = ['aaa','bbb','ccc']
数据库中的文件:
[{name:'bbb'},{name:'ccc'}]
我想查找不在数据库中的查询数组元素: return 结果应该是:
['aaa']
除了查询数组中的每个元素(或批次?)外,我找不到一些快速的方法来执行此操作
谁有更好的方法?谢谢
查询丢失的东西总是一个更昂贵的操作,而且没有“神奇”的查询可以为您完成。我推荐使用 Mongo 的 distinct 方法,像这样:
const queryArr = ['aaa', 'bbb', 'ccc'];
const allNames = await db.collection.distinct('name');
const notInDb = queryArr.filter(e => !allNames.includes(e));
但是,如果您想在 1 db 命令中执行此操作,您可以这样做:
db.collection.aggregate([
{
$group: {
_id: null,
names: {
"$addToSet": "$name"
}
}
},
{
"$replaceRoot": {
"newRoot": {
results: {
$filter: {
input: [
"aaa",
"bbb",
"ccc"
],
as: "datum",
cond: {
$not: {
"$setIsSubset": [
[
"$$datum"
],
"$names"
]
}
}
}
}
}
}
}
])
正如您所知,这两种方法都要求您将所有名称加载到内存中,没有办法解决这个问题,如果您的数据库规模对于这些方法来说太大,您将不得不遍历查询输入并执行此操作一个一个。
const queryArr = ['aaa', 'bbb', 'ccc'];
for (let queryName of queryArr) {
const found = await db.collection.findOne({name: queryName})
if (!found) {
//ding
}
}
假设您在 name
字段上有一个索引,这应该非常有效。