查询返回的结果多于预期

2024-04-24

请耐心等待,这并不是我真正的问题。只是想让别人理解。

作者注:

The 可能重复 https://stackoverflow.com/questions/4966203/mongo-query-question-gt-lt问题解决方案允许 $elemMatch 进行约束,因为 >all的元素是一个数组。这有点不同。

因此,在已接受的答案中,已经提出了要点。这种行为很好 记录在案你呢不应该 “比较‘苹果’和‘橙子’”。这些字段是 不同类型,虽然有解决方法,但真正的最佳解决方案 世界是不要这样做.

祝阅读愉快:)

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

 { "_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 and 20。所以这对我来说似乎是合乎逻辑的查询:

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

但问题是这会在结果中返回两个文档:

 { "_id" : ObjectId("52faa8ad95fa10cc7d2b790a"), "x" : 15 }
 { "_id" : ObjectId("52faa8b795fa10cc7d2b790c"), "x" : [ 5, 25 ] }

我不希望看到第二个结果,因为没有任何值介于两者之间10 and 20。 有人可以解释为什么我没有得到我期望的结果吗?我认为{“x”:15}应该是返回的唯一文件。

那么,我怎样才能得到我所期望的呢?


此行为是预期的,并在 mongo 文档中进行了解释here http://docs.mongodb.org/manual/reference/method/db.collection.find/#query-a-field-that-contains-an-array.

查询包含数组的字段

如果字段包含数组并且您的查询有多个条件 运算符,如果单个数组,则整个字段将匹配 元素满足条件or 数组元素的组合 满足条件.

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}} ] })

如果这是用户预期的行为,意见可能会有所不同。但这肯定是有记录的,并且应该是可以预料到的。

Edit,对于尼尔对原始答案的虐待狂但具有高度教育意义的编辑,寻求解决方案:

使用$elemMatch http://docs.mongodb.org/manual/reference/operator/query/elemMatch/可以进行“更严格”的元素比较仅数组.

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

Note:这将匹配 x:[11,12]andx:[11,25]

我相信当需要这样的查询时,可以结合使用two需要查询,并将结果合并。下面是一个查询,它返回 x 为的文档的正确结果不是数组:

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

但最好的办法在本例中是将 x 的类型更改为always是一个数组,即使它只包含一个元素。然后,只需要 $elemMatch 查询即可获得正确的结果和预期的行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查询返回的结果多于预期 的相关文章

随机推荐