gpt4 book ai didi

node.js - 是否可以对多个匹配结果进行 pullAll

转载 作者:太空宇宙 更新时间:2023-11-03 22:38:00 25 4
gpt4 key购买 nike

我有以下文件:

{
_id: 1
items: ['1a', '1b', '1c']
},
{
_id: 2,
items: ['2a', '2b', '2c']
}

是否可以从这些文档中提取项目,但前提是所有项目都存在?

解释一下:

我需要从这些文档中提取“1a”、“1c”和“2b”元素网,因此我发出如下查询:

var updateObj = ['1a', '1c', '2b'];
db.collection.update({_id : {$in updateObj}}, {$pullAll: {items: updateObj}});

Than 将返回成功并提取项目。

但是,如果发出以下查询:

var updateObj = ['1a', '1c', '2z'];
db.collection.update({_id : {$in updateObj}}, {$pullAll: {items: updateObj}});

然后我希望更新失败,因为任何文档中都不存在 2z。

最佳答案

好吧,我花了一些时间才弄清楚,但我确信我现在明白了。请稍等,因为这是一个冗长的解释,我希望我不会让您与英语混淆。

正如你所说,考虑到 $in 的参数你想做的是$pullAll数组字段中的元素,但仅当找到所有这些元素时。 (您的问题可能已接受编辑,现在可能会清除该问题)。

就目前情况而言,您会意识到您的第二个案例当​​然会从匹配文档中提取匹配元素('1a','1c'),甚至尽管您的“2z”元素与集合中的任何文档都不匹配。对于您想要实现的目标,我认为最后一句话是最重要的一点。

这种情况的主要问题,以及它不起作用的原因,是因为您正在匹配跨越不同文档的元素。

采用您希望匹配的第一个案例。指定的元素(“1a”、“1c”、“2b”)与您作为示例提供的两个文档相匹配。这是因为给定 $in 运算符,两个文档都满足条件,其中 第一个 包含元素 ('1a', '1c'),第二个 匹配 ('2b') 作为元素之一。

这里您的操作很简单(假设您使用多重更新),您已经匹配两个文档,并且更新部分很简单。因此,对于匹配的文档,我们只想从提供的列表中取出数组元素。这工作得很好。

在您的第二种情况中,我们可以看到“2z”不会在集合中的任何文档中看到。但由于我们跨越文档并且使用$in,我们发现第一个文档与条件(' 1a' 和 '1c' 存在并与 $in 匹配)。因此,这意味着带有给定参数的 $pullAll 将对该文档进行操作。正如您所知,$pullAll 并不关心all 元素是否不存在,它只会拉取与给定列表匹配的所有内容。

所以在这里你可以看到问题,是我们有多个文档,并且一个文档(或多个)将匹配这些条件,但你想做一些不同的事情。

那么您可以在更新表单中执行此操作吗?嗯,不。但我们可以采取另一种方法。我们想要做的是测试集合中文档中的所有元素是否匹配。因此,为此我们需要先分析,然后再决定更新。

小心,这有点做作。但请耐心听我说:

db.collection.aggregate([
// Look for "just what we are expecting to match"
{$match: {items: {$in: ['1a','1c', '2z']}} },

// Unwind the array for matching
{$unwind: "$items"},

// Pool this back into "one document"
{$group: { _id: null, items: {$addToSet: "$items"}}}

// Now ask the question again "Do you match **all**?"
{$match: {items: {$all: ['1a', '1c', '2z']}}}
])

所以这将做什么(通过逐步查看它可以更好地解释)是查看可能与您的初始匹配的文档并对进行分组>元素一起作为所有文档中的实际集合。然后我们最后问一个问题:“这些东西全部都在集合中找到了吗?

上面的过程在元素中使用“2z”时不会返回结果,但使用“2b”时会返回结果。因此,通过在发出更新语句之前执行此测试,您可以获得您想要的结果。

这不是更新失败,但您可以发布更新并满足您想要的条件之前检查失败 .

唷!我的酒杯在哪里?

关于node.js - 是否可以对多个匹配结果进行 pullAll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21879170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com