0

这个问题与我的非常相似:有没有办法检查其中一个数组条目是否包含 MongoDB 中的子数组?

但是,在我的一些更新中,我仍然遇到问题。我通过拉入标签的聚合器获取数据。标签看起来像这样$tags = array("red","green","blue","purple",...);

我的更新查询如下所示:

$criteria = array('_id' => new MongoId($myID));

$db->aggregation->update($criteria, 
                         array('$addToSet' =>
                            array('tags' =>
                               array('$each' => $tags)))), 
                         true); //add tags

信不信由你,有时它可以很好地工作,但有时却不行。您可以在下面的示例中看到哪些有效,哪些无效。

[74] => red
[75] => orange
[76] => yellow
[77] => green
[78] => Array (
    [$each] => Array (
        [0] => blue
        [1] => indigo
        [2] => purple
    )
)
[79] => violet
[80] => brown
[81] => black

谁能向我解释为什么有时这会正确插入到集合的数组中,有时却不会?我正在使用 phpmoadmin(以及 MongoDB shell 版本 2.4.3 'find()')来查看插入的结果。

4

1 回答 1

0

对于初学者,将布尔值作为第三个参数传递给MongoCollection::update()在 1.3.0 中已弃用。在下面的示例中,我使用现在建议的$options数组作为该方法的第三个也是最后一个参数。

您能否验证$each示例中第 78 个数组元素的键正是这五个字符并且不包括前导不可打印字符?$each如果我以(即表单提要)为前缀chr(13),MongoDB 不会发现我正在使用运算符,并且会很高兴地将对象参数添加到集合/数组中。

除此之外,我可以重现上述内容的唯一方法是制作一个更新,其中$each的值是一个对象:

$c->update(
  ['_id'=>1],
  ['$addToSet' => [
    'tags' => ['$each' => (object) [1,2,3,4,5]],
  ]],
  ['upsert' => true]
);

这导致插入以下内容(使用 Mongo shell,以便我们可以区分数组和对象):

{
    "_id" : NumberLong(1),
    "tags" : [
        {
            "$each" : {
                "0" : NumberLong(1),
                "1" : NumberLong(2),
                "2" : NumberLong(3),
                "3" : NumberLong(4),
                "4" : NumberLong(5)
            }
        }
    ]
}

如果其他元素已经在 中tags,则上述内容可能会进一步进入数组,如下所示:

{
    "_id" : NumberLong(1),
    "tags" : [
        NumberLong(1),
        NumberLong(2),
        NumberLong(3),
        NumberLong(4),
        NumberLong(5),
        {
            "$each" : {
                "0" : NumberLong(1),
                "1" : NumberLong(2),
                "2" : NumberLong(3),
                "3" : NumberLong(4),
                "4" : NumberLong(5)
            }
        }
    ]
}
于 2013-08-19T17:20:00.853 回答