【发布时间】:2020-05-19 19:07:27
【问题描述】:
假设我有一个如下所示的文档:
{
"id": 1,
"entries": [
{
"id": 100,
"urls": {
"a": "url-a",
"b": "url-b",
"c": "url-c"
},
"revisions": []
}
]
}
我正在尝试向包含其自己的 urls 字段的 revisions 数组添加一个新对象。其中两个字段应从条目的urls 复制,而最后一个字段将是新的。结果应如下所示:
{
"id": 1,
"entries": [
{
"id": 100,
"urls": {
"a": "url-a",
"b": "url-b",
"c": "url-c"
},
"revisions": [
{
"id": 1000,
"urls": {
"a": "url-a", <-- copied
"b": "url-b", <-- copied
"c": "some-new-url" <-- new
}
}
]
}
]
}
我使用的是 MongoDB 4.2+,所以我知道我可以在更新查询中使用 $property 来引用值。但是,这似乎并没有像我预期的那样工作:
collection.updateOne(
{
id: 1,
"enntries.id": 100
},
{
$push: {
"entries.$.revisions": {
id: 1000,
urls: {
"a": "$entries.$.urls.a",
"b": "$entries.$.urls.b",
"c": "some-new-url"
}
}
}
}
);
元素被添加到数组中,但我看到的所有 url 值都是文字 $entries.$.urls.a。值我怀疑问题在于将引用与选择特定位置数组元素相结合。我也尝试过使用$($entries.$.urls.a),结果相同。
我怎样才能做到这一点?
【问题讨论】:
-
您的查询几乎没有问题,所以
entires是一个数组,您想对整个数组中的每个对象执行此操作,还是对少数对象或仅对第一个对象执行此操作? -
我想完全为匹配
entries.id的那个做它,所以我相信我所拥有的是正确的。那部分的行为如我所愿。
标签: arrays mongodb mongodb-query aggregation-framework