我们有一些看起来像这样的嵌入式文档:
{
"_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")
}
]
}
Run Code Online (Sandbox Code Playgroud)
由于上面的文档包含在一个数组中,我无法从选择器中选择它,如下所示:
User.collection.update({"_id" => user.id}, {:$set => {"alert.matches" => matches}})
Run Code Online (Sandbox Code Playgroud)
但这将更新所有#alerts匹配.我只想用ID"4fa7fd60e5be08bcc9000644"更新一个警报.
您可以使用位置运算符来标识数组元素:
$位置运算符
$运算符(单独)表示"查询中匹配数组项的位置".使用它来查找数组成员,然后对其进行操作.
所以可能是这样的:
User.collection.update(
{ :_id => user.id, :matches => BSON::ObjectId('4e40238dbc9f6ec5a6000eed') },
{ :$set => { 'alert.matches.$' => matches } }
)
Run Code Online (Sandbox Code Playgroud)
但正如塞尔吉奥指出的那样,很难根据问题中有限的信息来梳理文档的结构.
在我回答之后看起来更多的信息出现了,它看起来像:
{ :$set => { 'alerts.$.matches' => ... } }
Run Code Online (Sandbox Code Playgroud)
是你需要的.并且您将需要包含:matches在查询中以便$具有可引用的内容.
| 归档时间: |
|
| 查看次数: |
1868 次 |
| 最近记录: |