$ set运算符将数组索引解释为mongodb

时间:2015-10-27 17:01:05

标签: arrays mongodb

如果字段尚未创建为数组,MongoDB似乎将$set路径用数字组件解释为对象键而不是数组索引。

> db.test.insert({_id: "one"});
> db.test.update({_id: "one"}, {$set: {"array.0.value": "cheese"}});
> db.find({_id: "one"})
{ "_id": "one", "array": { "0" : { "value" : "cheese" } }

我希望得到"array": [{"value": "cheese"}],但是它被初始化为一个带有字符串“0”的键的对象。

我可以通过初始化整个数组来获得一个数组,如下所示:

> db.test.update({_id: "one"}, {$set: {"array": [{"value": "cheese"}]}});

...但是这会破坏任何现有属性和之前可能已设置的其他数组元素。

有没有办法说服$set我希望“数组”成为一个数组类型,具有以下约束:

  1. 我想在单个查询中执行此操作,而不先查找记录。
  2. 我想保留任何现有的数组条目和对象值
  3. 简而言之,如果“数组”已经初始化为数组,我想要$set: {"array.0.value": ... }的行为,而不知道它是否有。这可能吗?

1 个答案:

答案 0 :(得分:1)

我不确定没有查询是否可行。也许您可以更改架构设计,并尝试这样的事情:

namespace Smawt\Helpers;

use \Pusher;

class PusherConnect
{
    protected $app;

    public function __construct($app)
    {
        $this->app = $app;

        $pusher = new Pusher(

处理MongoDb中的数组元素(数组中的子文档)很痛苦。 https://jira.mongodb.org/browse/SERVER-1243