mongodb - 如何在 MongoDB 中 $set 子子数组项

标签 mongodb

我正在开发一个网络应用程序,它有一个类似门户的组件(就像多个面板,可以在列之间移动并添加或删除)。我正在使用 MongoDB 以如下格式存储此信息...

{
    _id: ObjectId(...),
    title: 'My Layout',
    columns: [
        {
            order: 1,
            width: 30,
            panels: [
                { title: 'Panel Title', top: 100, content: '...' },
                { title: 'Panel Title', top: 250, content: '...' },
            ]
        },
        {
            ... multiple columns ...
        }
    ]
}

我尝试将原子/修饰符操作与 update() 一起使用,这变得令人困惑。如果我只想更新特定面板的一个属性,我该如何引用它?

update(
    { _id: ObjectId(...) },
    { $set: { columns.[???].panels.[???].top: 500 }
)

最佳答案

如果您知道数组中的索引,则可以使用点表示法直接访问数组元素。

update(
{ _id: ObjectId(xxxx) },
{ $set: { 'columns.0.panels.0.top' : 125}}
)

确保将点表示的路径作为字符串括在引号中。

编辑:

为了更详细地了解它如何动态工作,我将给出一个 PHP 示例:

$action = array("columns.$colNum.panels.$panelNum" => $newValue);

是的,有positional operator ,但是它does not appear to be advanced enough要更改数组中的数组,这可能会在 MongoDB 1.7.0 中发生变化

您可以采用另一种替代方法,而不是尝试将此信息填充到嵌套文档中。尝试将其压平。您可以创建一个包含面板和列对象的集合:

列对象:

{
_id: // MongoId
type: 'column',
user: 'username',
order: 1,
width: 30,
}

面板对象:

{
_id: //MongoId
type: 'panel',
user: 'username',
parentColumn: //the columns _id string
top: 125,
left: 100
}

然后您可以通过执行以下操作找到属于用户的所有列:

find({ type: 'column', user:'username'});

您可以通过执行以下操作查找特定列的所有面板:

find({type: 'panel', columnOwner:'ownerID'});

由于每个列和面板都有 MongoDB 为其提供的唯一 ID,因此您可以轻松查询和自动设置选项。

update({'_id': ObjectId('idstring')}, {$set : { 'top' : 125}});

关于mongodb - 如何在 MongoDB 中 $set 子子数组项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3473075/

相关文章:

node.js - 有没有办法在 mongodb(mongoose) 的单个查询中创建 "stored procedure"调用多查询

mongodb - 来自 Mongo 的随机抽样

javascript - Meteor js发布订阅 react 很慢

node.js - Mongoose 使用多个字段查找和排序

Mongodb 后台索引 - 一旦创建它们仍然是后台吗?

javascript - 如何使用 mongoose 在 Postman 中实现查询参数

MongoDB 查询 - 返回切片数组

mongodb降序升序索引

javascript - 为什么我的大部分结果都是 nan

python - 如何使用 PyMongo 迭代和更新文档?