Mongoose在更新文档时忽略$ ne

时间:2015-02-06 21:47:10

标签: node.js mongodb mongoose socket.io

我正在为后端使用Node,Mongoose和Socket.io构建一个持久的html字段框架。我遇到了Mongoose更新方法中的错误。

mongo中的文档如下所示:

{
    "_id" : "pickable_qty",
    "currently_connected" : [ ],
    "locks" : [
        {
            socket_id: 'eQYVyz1z28rJZRPpAAAB',
            unique_values:{
                merchant_warehouse_id: 11.1,
                product_item_id: 5555
            }
        },
        {
            socket_id: 'eQYVyz1z28rJZRPpAAAB',
            unique_values:{
                merchant_warehouse_id: 11.2,
                product_item_id: 5555
            }
        },
        {
            socket_id: 'eQYVyz1z28rJZRPpAAAB',
            unique_values:{
                merchant_warehouse_id: 11.1,
                product_item_id: 1234
            }
        }
    ],
    "definition" : {
        "ajax_url" : "/persistent-fields/pickable_qty",
        "unique_keys" : [
            "product_item_id",
            "merchant_warehouse_id"
        ],
        "max_idle_seconds" : 30,
        "field_type" : "text"
    },
    "__v" : 0
}

当我开始将子文档插入locks数组时,会出现问题。

我使用Mongoose的update方法插入它们,如下所示:

FieldSchema.update(
    {
        _id: 'pickable_qty',
        'locks.unique_values': { 
            '$ne': { 
                merchant_warehouse_id: 11.1, 
                product_item_id: 5334 
            } 
        },
        'definition.unique_keys': { 
            '$all': [ 
                'merchant_warehouse_id', 
                'product_item_id' 
            ] 
        } 
    },
    {
        '$push': {
            locks: { 
                socket_id: 'eQYVyz1z28rJZRPpAAAB', 
                unique_values: {
                    merchant_warehouse_id: 11.1, 
                    product_item_id: 5334 
                } 
            } 
        }
    },
    function(err, count, res){
        console.log('err:', err, 'count:', count, 'res:', res);
        //err: null count: 1 res: { ok: true, n: 1, updatedExisting: true }
    }
);

第一个插件完全按预期工作,数组中没有locks包含唯一值{merchant_warehouse_id: 11.1,product_item_id: 5334},因此找到了文档并插入了lock子文档。

但是,第二次运行同一更新不应插入新的locks子文档,因为已存在同一unique_values的{​​{1}},查询的$ne部分应该使其返回没有匹配要更新。

我已经确认使用相同的查询执行find不会在MongoDB命令行上使用Mongoose自己的Schema.find方法返回任何文档,但Schema.update方法仍会找到文档并插入一个重复的lock子目录。

我是否只是疯了,或者有没有理由说明为什么Mongoose的find方法会在update期间无法检索文档?

2 个答案:

答案 0 :(得分:0)

问题是您正在查询对象是否与子文档匹配,这可能很棘手。您想要做的是在查询中使用$ elemMatch和$ ne的组合。

var query = {
    _id: 'pickable_qty',
    'locks': { 
        $elemMatch: {
            merchant_warehouse_id: {
                $ne: 11.1
            },
            product_item_id: {
                $ne: 5334
            }
        }
    },
    'definition.unique_keys': { 
        '$all': [ 
            'merchant_warehouse_id', 
            'product_item_id' 
        ] 
    } 
}

它基本上是对数组内部文档的查询。

答案 1 :(得分:0)

在使用MongoDB的查询分析器之后,我发现Mongoose在执行更新查询时正在切换lock的{​​{1}}对象中的键的顺序。然后它以正确的顺序插入重复的子文档和键。显然,只有当子文档中的键与查询的顺序相同时,MongoDB的unique_values运算符才会匹配嵌套的子文档数组。