Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 查询返回的结果超出预期_Mongodb - Fatal编程技术网

Mongodb 查询返回的结果超出预期

Mongodb 查询返回的结果超出预期,mongodb,Mongodb,请容忍我,这不是我真正的问题。只是想让别人理解 作者注: 问题解决方案允许$elemMatch约束,因为所有元素都是数组。这有点不同 因此,在公认的答案中提出了要点。这种行为很好 你不应该把“苹果”和“橙子”作比较。这些田地都是绿色的 不同的类型,虽然有解决办法,但最好的解决方案是真正的 世界是不要这样做 快乐阅读:) 我有一个试图搜索的文档集合,该集合包含以下内容: { "_id" : ObjectId("52faa8a695fa10cc7d2b7908"), "x" : 1 } { "_

请容忍我,这不是我真正的问题。只是想让别人理解

作者注:

问题解决方案允许$elemMatch约束,因为所有元素都是数组。这有点不同

因此,在公认的答案中提出了要点。这种行为很好 你不应该把“苹果”和“橙子”作比较。这些田地都是绿色的 不同的类型,虽然有解决办法,但最好的解决方案是真正的 世界是不要这样做

快乐阅读:)

我有一个试图搜索的文档集合,该集合包含以下内容:

 { "_id" : ObjectId("52faa8a695fa10cc7d2b7908"), "x" : 1 }
 { "_id" : ObjectId("52faa8ab95fa10cc7d2b7909"), "x" : 5 } 
 { "_id" : ObjectId("52faa8ad95fa10cc7d2b790a"), "x" : 15 }
 { "_id" : ObjectId("52faa8b095fa10cc7d2b790b"), "x" : 25 }
 { "_id" : ObjectId("52faa8b795fa10cc7d2b790c"), "x" : [ 5, 25 ] }
所以我想找到x介于
10
20
之间的结果。这就是我认为合乎逻辑的问题:

db.collection.find({ x: {$gt: 10, $lt: 20} })
但问题是,这会在结果中返回两个文档:

 { "_id" : ObjectId("52faa8ad95fa10cc7d2b790a"), "x" : 15 }
 { "_id" : ObjectId("52faa8b795fa10cc7d2b790c"), "x" : [ 5, 25 ] }
我不希望看到第二个结果,因为没有一个值介于
10
20
之间。 有人能解释为什么我没有得到我期望的结果吗?我认为{“x”:15}应该是唯一返回的文档


那么,我如何才能得到我所期望的呢?

这种行为在mongo文档中得到了预期和解释

查询包含数组的字段

如果字段包含数组,并且查询具有多个条件 运算符,如果单个数组中有一个 元素满足条件数组元素的组合 符合条件

Mongo似乎愿意扮演“自鸣得意”的角色,当数组元素的组合独立匹配所有条件时返回结果

在我们的示例中,5个匹配$lt:20条件,25个匹配$gt:10条件。所以,这是一场比赛

以下两项都将返回[5,25]结果:

db.collection.find({ x: {$gt: 10, $lt: 20} })

db.collection.find({ $and : [{x: {$gt: 10}},{x:{ $lt: 20}} ] })
如果这是用户期望的行为,则意见可能会有所不同。但它肯定是有文件记录的,应该是可以预料的

编辑,针对尼尔的虐待狂但极具教育意义的编辑,编辑原始答案,寻求解决方案:

使用只能对数组进行“更严格”的元素比较

db.collection.find({ x: { $elemMatch:{ $gt:10, $lt:20  } } })
注意:这将同时匹配x:[11,12]x:[11,25]

我相信当需要这样一个查询时,需要对两个查询进行组合,并将结果组合在一起。下面是一个查询,它为x为而不是数组的文档返回正确的结果:

db.collection.find( { $where : "!Array.isArray(this.x)", x: {$gt: 10, $lt: 20} } )

但在这种情况下,最好的方法是将x的类型更改为始终为数组,即使它只包含一个元素。然后,只需要$elemMatch查询就可以获得正确的结果和预期的行为。

mongo文档中对这种行为进行了预期和解释

查询包含数组的字段

如果字段包含数组,并且查询具有多个条件 运算符,如果单个数组中有一个 元素满足条件数组元素的组合 符合条件

Mongo似乎愿意扮演“自鸣得意”的角色,当数组元素的组合独立匹配所有条件时返回结果

在我们的示例中,5个匹配$lt:20条件,25个匹配$gt:10条件。所以,这是一场比赛

以下两项都将返回[5,25]结果:

db.collection.find({ x: {$gt: 10, $lt: 20} })

db.collection.find({ $and : [{x: {$gt: 10}},{x:{ $lt: 20}} ] })
如果这是用户期望的行为,则意见可能会有所不同。但它肯定是有文件记录的,应该是可以预料的

编辑,针对尼尔的虐待狂但极具教育意义的编辑,编辑原始答案,寻求解决方案:

使用只能对数组进行“更严格”的元素比较

db.collection.find({ x: { $elemMatch:{ $gt:10, $lt:20  } } })
注意:这将同时匹配x:[11,12]x:[11,25]

我相信当需要这样一个查询时,需要对两个查询进行组合,并将结果组合在一起。下面是一个查询,它为x为而不是数组的文档返回正确的结果:

db.collection.find( { $where : "!Array.isArray(this.x)", x: {$gt: 10, $lt: 20} } )

但在这种情况下,最好的方法是将x的类型更改为始终为数组,即使它只包含一个元素。然后,只需$elemMatch查询即可获得正确的结果和预期的行为。

您可以首先检查子文档是否为而不是和数组,并为所需的值提供筛选器:

db.collection.find(
  { 
    $and : 
      [
        { $where : "!Array.isArray(this.x)" }, 
        { x: { $gt: 10, $lt: 20 } }
      ]
  }
)
返回:

 { "_id" : ObjectId("52fb4ec1cfe34ac4b9bab163"), "x" : 15 }    

您可以首先检查子文档是否为而不是,然后设置数组,并为所需的值提供一个过滤器:

db.collection.find(
  { 
    $and : 
      [
        { $where : "!Array.isArray(this.x)" }, 
        { x: { $gt: 10, $lt: 20 } }
      ]
  }
)
返回:

 { "_id" : ObjectId("52fb4ec1cfe34ac4b9bab163"), "x" : 15 }    

这是对该问题的有意提及,但其措辞是海报没有提出的实际问题。他们的问题已经在上下文中得到了回答,但对这一部分的回答为任何提出类似问题的人澄清了问题。让我们看看谁做对了。这是因为MongoDB不过滤子文档,它过滤子文档,但不是这样:)您可以使用elemMatch或聚合框架,但elemMatch只会返回第一个匹配项,聚合框架可能与在application@kocko继续为什么?问题需要答案,而不是评论。我故意不回答自己。考虑到这是一个很好的学习练习。这是对这个问题的有意提及,但它的措辞是海报没有问的实际问题。他们的问题已经在上下文中得到了回答,但对这一部分的回答为任何提出类似问题的人澄清了问题。让我们看看谁做对了。这是因为MongoDB不过滤子文档,而是过滤子文档,但不是这样:)您可以使用elemMatch o