Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在单个嵌入文档中更新MongoDB中的单个字段_Ruby_Mongodb - Fatal编程技术网

Ruby 在单个嵌入文档中更新MongoDB中的单个字段

Ruby 在单个嵌入文档中更新MongoDB中的单个字段,ruby,mongodb,Ruby,Mongodb,我们有一些嵌入式文档,如下所示: { "_id" : ObjectId("4e402353bc9f6ec5a6000001"), "first_name" : "Chris", "last_name" : "Jones", "alerts" : [ { "_id" : ObjectId("4f7cd6ffc067db00070022d4"), "name" : "Default", "email_frequency" : "we

我们有一些嵌入式文档,如下所示:

 {
"_id" : ObjectId("4e402353bc9f6ec5a6000001"),
"first_name" : "Chris",
"last_name" : "Jones",

    "alerts" : [
    {
        "_id" : ObjectId("4f7cd6ffc067db00070022d4"),
        "name" : "Default",
        "email_frequency" : "weekly",
        "interested_industries" : [
            "Computer Software",
            "Internet"
        ],
        "interested_employers" : [
            "Facebook",
            "AOL"
        ],
        "interested_skills" : [ ],
        "matches" : [
            ObjectId("4ee46a2a0dd0c70017000365"),
            ObjectId("4efa1707bacfa40001012b65"),
            ObjectId("4e402376bc9f6ec5a6000a7a"),
            ObjectId("4e4e0eb8d052fc4028021f66"),
            ObjectId("4ee55d8500ca410014000003"),
            ObjectId("4ee63d06d96b850001008688"),
            ObjectId("4e57be7ed052fc606a002335"),
            ObjectId("4f05d47d9ce340001702ba42"),
            ObjectId("4f200ffcaf5f34000e0021a4"),
            ObjectId("4e4de701d052fc33da00052f")
        ],
        "updated_at" : ISODate("2012-05-03T18:26:14.774Z")
    }
]
 }
User.collection.update({"_id" => user.id}, {:$set => {"alert.matches" => matches}})
由于上面的文档包含在一个数组中,我很难从选择器中选择它,如下所示:

 {
"_id" : ObjectId("4e402353bc9f6ec5a6000001"),
"first_name" : "Chris",
"last_name" : "Jones",

    "alerts" : [
    {
        "_id" : ObjectId("4f7cd6ffc067db00070022d4"),
        "name" : "Default",
        "email_frequency" : "weekly",
        "interested_industries" : [
            "Computer Software",
            "Internet"
        ],
        "interested_employers" : [
            "Facebook",
            "AOL"
        ],
        "interested_skills" : [ ],
        "matches" : [
            ObjectId("4ee46a2a0dd0c70017000365"),
            ObjectId("4efa1707bacfa40001012b65"),
            ObjectId("4e402376bc9f6ec5a6000a7a"),
            ObjectId("4e4e0eb8d052fc4028021f66"),
            ObjectId("4ee55d8500ca410014000003"),
            ObjectId("4ee63d06d96b850001008688"),
            ObjectId("4e57be7ed052fc606a002335"),
            ObjectId("4f05d47d9ce340001702ba42"),
            ObjectId("4f200ffcaf5f34000e0021a4"),
            ObjectId("4e4de701d052fc33da00052f")
        ],
        "updated_at" : ISODate("2012-05-03T18:26:14.774Z")
    }
]
 }
User.collection.update({"_id" => user.id}, {:$set => {"alert.matches" => matches}})
但这将更新所有匹配的警报。我只想更新ID为“4fa7fd60e5be08bcc9000644”的one警报

您可能可以使用来标识数组元素:

$positional操作符

$运算符(本身)表示“查询中匹配数组项的位置”。使用此选项查找数组成员,然后对其进行操作

因此,也许类似于:

User.collection.update(
    { :_id => user.id, :matches => BSON::ObjectId('4e40238dbc9f6ec5a6000eed') },
    { :$set => { 'alert.matches.$' => matches } }
)
但正如Sergio所指出的,根据问题中有限的信息很难梳理出文档的结构


在我回答后,似乎收到了更多信息,看起来:

{ :$set => { 'alerts.$.matches' => ... } }

这就是你需要的。您需要在查询中包含
:匹配项
,以便
$
有参考资料。

最好发布准确的json文档。这是关于ruby驱动程序实现的,json不相关。我不确定我在这里看到的是什么。如果人们不能帮助你,它就会变得相关:)只是添加了文档的结构。我发现下面的查询完成了它:User.collection.update({“alerts.\u id”=>alerts.id},{:$set=>{“alerts.$.matches”=>[“WTF???”]})这假设我必须有一个关于“alerts.\u id”的索引,对吗?此外,位置运算符是否依赖于选择器?例如,如果我的选择器是{“\u id”=>user.id},那么位置将无法正常工作?@user577808:您不需要索引。如果在搜索中不包含数组,则
$
将没有任何可参考的内容。我链接到的文档中有关于位置运算符的更多信息:@AsyaKamsky:那里是否有一个错误的“回车”符?看来你的评论被打断了。