MongoDB:在数组中找到两个完全匹配的项,但都不是

里斯·丹尼尔斯

我已经对此进行了一段时间的战斗,但似乎无法弄清楚如何执行理论上应该是一个非常简单的查询...

我需要检索(或更确切地说,排除)包含数组的文档,其中两个值都出现在数组中的精确索引处,但是没有一个值出现在该精确索引处。我已经尝试过$ and运算符来实现这一点,但是我没有得到我期望的结果。

数组也可以大于2个值。

我已经尝试了以下代码,但是省略了在确切位置包含任一值的所有文档,而不仅是两个。

$and: [{"value.0": {$ne: 'X'}}, {"value.1": {$ne: 'X'}}]

我期望:

[X,X] 被排除在外

[Y,X] 被包括

[X,Y] 被包括

尼尔·伦恩

是的,这有点棘手,但是您的意思是$or

拿下您的文件:

{ "value" : [ "X", "X" ] }
{ "value" : [ "X", "X", "A" ] }
{ "value" : [ "Y", "X" ] }
{ "value" : [ "X", "Y" ] }
{ "value" : [ "B", "Y" ] }

然后使用来运行您的$ne不平等条件$or

db.collection.find({ 
  "$or": [
    { "value.0": { "$ne": "X" } },
    { "value.1": { "$ne": "X" } }
  ]
})

返回三个文档:

{ "value" : [ "Y", "X" ] }
{ "value" : [ "X", "Y" ] }
{ "value" : [ "B", "Y" ] }

这是因为其中任何一个条件都需要完成,即"X"不必是这些位置任何一个元素的值当您的逻辑是“这个那个”时,您实际上是在说$or

请注意,不要将这与$nor哪个谓词都不应该“完全匹配的语句混淆

db.collection.find({ 
  "$nor": [
    { "value.0": "X" },
    { "value.1": "X" }
  ]
})

将返回:

{ "value" : [ "B", "Y" ] }

两个位置值都不包含"X"

基本上可以归结为区分之间或者没有在您需要办理什么


警告

如果您实际上要确保的是“第一个位置”必须在其中一个元素中包含“ X”,那么您基本上需要一个计算表达式来“切片”添加到查询末尾的数组内容逻辑:

无论是从3.6 MongoDB的现代及以上的使用$expr$slice

db.collection.find({ 
  "$or": [
    { "value.0": { "$ne": "X" } },
    { "value.1": { "$ne": "X" } }
  ],
  "$expr": {
    "$in": [ "X", { "$slice": [ "$value", 0, 2 ] }]
  }
})

或通过$where旧版本:

db.collection.find({ 
  "$or": [
    { "value.0": { "$ne": "X" } },
    { "value.1": { "$ne": "X" } }
  ],
  "$where": function() {
    return this.value.slice(0,2).indexOf("X") != -1
  }
})

两者都只会返回"X"所有存在的地方

{ "value" : [ "Y", "X" ] }
{ "value" : [ "X", "Y" ] }

不能使用常规查询运算符来表达用于查看“数组切片”中要存在的值的附加逻辑。因此,使用附加语句是为了丢弃那些位置处带有“ X”的所有内容。

请注意,从技术上讲,所有表达式都是必需的,但是这种计算表达式需要进行集合扫描,而常规的不等式运算实际上不需要。

因此,如果这是您的意图,最好将两者结合起来。

同样,“技术上”只需匹配"X" “可能”就足够了:

db.collection.find({ 
  "value": "X",
  "$or": [
    { "value.0": { "$ne": "X" } },
    { "value.1": { "$ne": "X" } }
  ]
})

但这不能保证该值出现在前两个位置

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在数组中找到两个价格相加的项的索引

如何在两个包含字典的数组中找到匹配项?

如果当前进程都不是,可以在Erlang中链接两个进程吗?

如何比较两个数组并在Clickhouse中找到数组中的匹配项(0/1)

PHP on 在数组中找到两个键等于两个值的数组并将其从数组中移除

R:在两个列表中找到(最佳/不完全)匹配元素的索引

如何在数组中找到两个相似数字的索引?

在数组中找到两个最小的非后续元素

在数组中找到所有可能的两个组合的集合

在数组中找到两个元素,该元素仅发生一次

如何在数组中找到与整数和数字之间的两个最接近的差

如何在 Python 中找到两个 2D 列表之间的匹配项?

Laravel验证-数组字段,仅允许两个字段之一,但都不是必需字段

在数组中找到第K个匹配结果?

在数组中找到最大值,但是如果最大值在数组中两个或两个以上位置存在怎么办?

如何在React中找到两个嵌套数组之间的不匹配元素

如何在两个数组中找到匹配的值?

Js on mousehover - 从两个 div 中找到匹配的文本

如何从两个表中找到匹配的数据?

在两个以上的列表中找到匹配的元素

如何从两个列表中找到匹配的部分项目

如何比较两个数组中的值以找到一个或多个匹配项?[jQuery]

在数组中找到两个数字的最佳方法,它们的总和是一个特定的数字

如何在python中的数据集的两个不同列中找到相同值的匹配项

在两个目录中找到匹配的文件名并将匹配的文件名写入数组

如果找到匹配项,则比较两个数组

在MongoDB中找到两个共享键值的文档

在两个集合之间找到完全匹配的等效数字

在numpy数组中找到两个值之间的差异