首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >猫鼬在更新文档时忽略$ne

猫鼬在更新文档时忽略$ne
EN

Stack Overflow用户
提问于 2015-02-06 21:47:10
回答 2查看 242关注 0票数 0

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

蒙戈的文件是这样的:

代码语言:javascript
运行
复制
{
    "_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方法插入它们,如下所示:

代码语言:javascript
运行
复制
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中,查询的$ne部分应该导致它不返回要更新的匹配项。

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

我是疯了,还是有什么原因让Mongoose的find方法不会检索文档,而update会检索文档呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-07 00:33:45

在使用MongoDB的查询分析器后,我发现Mongoose在执行更新查询时正在切换lockunique_values对象中的键的顺序,然后按正确的顺序插入重复的子文档和键。因此,显然MongoDB的$ne操作符只有在子文档中的键与查询的顺序相同的情况下才会匹配嵌套的子文档数组。

票数 0
EN

Stack Overflow用户

发布于 2015-02-06 22:13:18

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

代码语言:javascript
运行
复制
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' 
        ] 
    } 
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28375353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档