我被困住了!
考虑在产品系列中使用这些产品:
{
_id: ObjectId("53678a557e6e9e19dd4ef1c8"),
name: "product 1",
rules: [
{
type: "one_purchase_per_user"
}
],
stock: 0,
unlimited_stock: true
},
{
_id: ObjectId("53678a557e6e9e19dd4ef1c7"),
name: "product 2",
rules: [],
stock: 0,
unlimited_stock: true
}
用户已购买以下产品:ObjectId("53678a557e6e9e19dd4ef1c8")
我正在尝试接收所有库存大于0或者unlimited_stock的产品,这些产品要么没有one_purchase_per_user
规则,要么(如果有的话)尚未由特定用户通过以下查询购买:
db.products.find({
'$and': [
{ '$or': [
{ stock: { '$gt': 0 } },
{ unlimited_stock: true }
] },
{ '$or': [
{ 'rules.type': 'one_purchase_per_user', _id: { $nin: [ObjectId("53678a557e6e9e19dd4ef1c8")] } },
{ 'rules.type': { '$ne': 'one_purchase_per_user' } }
] }
]
})
我收到以下错误:
error: { "$err" : "assertion src/mongo/db/query/plan_enumerator.cpp:1040" }
如果我删除关于$ nin的部分或者在最后一个$或条件中更改字段名称,查询成功但是条件没有意义,因为它没有完成我想要它做的事情。
我正在运行mongodb 2.6.0
编辑:我弄清楚导致错误的原因,但我不知道原因:我在rules.type上有一个索引,如果我删除了该索引,则查询有效
答案 0 :(得分:1)
升级到mongodb 2.6.1之后,我遇到了类似的问题
可能会出现在2.6.2中的错误修复 - 这是错误报告:
https://jira.mongodb.org/browse/SERVER-13714
来自JIRA问题的评论
它不完全是$或相关,而是我们如何为可以使用索引的$ not查询生成计划的问题。
答案 1 :(得分:0)
添加产品并执行查询我得到以下结果(使用MongoDB shell 2.4.9):
{ "_id" : ObjectId("53678a557e6e9e19dd4ef1c7"), "name" : "product 2",
"rules" : [ ], "stock" : 0, "unlimited_stock" : true }
所以这对我有用。
尝试引用$nin
和_id
,就像使用其他代码一样:'$nin'
和'_id'
。