获取没有特定子文档或具有特定子文档和其他条件的记录

时间:2014-05-05 14:35:55

标签: mongodb

我被困住了!

考虑在产品系列中使用这些产品:

{
    _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上有一个索引,如果我删除了该索引,则查询有效

2 个答案:

答案 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'