$或两个$ elemMatch使用位置$给定位置运算符没有找到查询所需的匹配。未更新的更新

时间:2016-03-13 18:43:16

标签: node.js mongodb mongodb-query updates

大家好,非常感谢你提前帮助。

我们正在尝试构建用户的分层树,在某些时候我们需要在双嵌套数组中推送一个元素。 想象一下以下结构:

User A (children -> User B and C)
    User B (parent -> User A, children -> User C)
        User C (parent -> User B)

在某些时候,我们需要将新用户作为用户C的兄弟,因此在用户B下。结构将是这样的:

User A (children -> User B, C and D)
    User B (parent -> User A, children -> User C and D)
        User C (parent -> User B)
        User D (parent -> User B)

我们更新的唯一信息是我们必须将新用户置于其中的父级,因此我们知道用户B将成为用户C的父级。 我试图弄清楚它是如何在单个查询中进行的,但是带有$或两个$ elemMatch的查询不会起作用并抛出以下错误

  

位置操作员未找到查询所需的匹配项。   未更新的更新:帐户。$。儿童

这是我正在尝试的查询

db.users.update({
    "$or": [{
        "_id": "User B",
        "accounts": {
            "$elemMatch": {
                "group": "GROUPID"
            }
        }
    }, {
        "accounts": {
            "$elemMatch": {
                "children._id": "USER B",
                "group": "GROUPID"
            }
        }
    }]
}, {
    "$push": {
        "accounts.$.children": [{
            "_id": "USER D",
            "permission": "write"
        }]
    }
}, {
    multi: true
})

数据结构如下

{
    _id: 'USER B',
    accounts: [{
        group: 'GROUP 1',
        parent: 'User X',
        children: [{
            _id: 'User Y',
            permission: 'write'
        }]
    }, {
        group: 'GROUP 2',
        parent: 'User A',
        children: [{
            _id: 'User C',
            permission: 'write'
        }]
    }]
}

关键是他们可以拥有属于不同组的不同帐户,我只应该更新属于同一其他用户组的帐户(更新时也知道groupId)

如果我尝试在$或(任何一个)的条件中完全相同的查询,它按预期工作,但是在$内部或两个条件同时它在使用位置运算符时失败$

也许唯一的解决方案是在两个查询中进行,但我想知道它是否可能在一个,如果不是,为什么不。非常感谢你们。

埃里克。

0 个答案:

没有答案