更新:将字段移到另一个的字段数组中

时间:2020-10-08 09:39:42

标签: mongodb mongodb-query

如果可能的话,我不是100%,但我认为应该是。

我想更新文档,以便将字段(END)插入数组(INTERMISSIONS)。我认为我非常接近实现它,但是我遇到了错误或插入了字符串“ $ END”。

我有两个查询:

db.myCollection.findOneAndUpdate(
    {"_id" : new ObjectId("...")}, 
    { '$push' : {'INTERMISSIONS' : '$END' } }
)

此操作已成功完成,但没有插入$ END值,而是插入了“ $ END”

db.myCollection.findOneAndUpdate(
    {"_id" : new ObjectId("...")}, 
    { '$push' : 
        {'INTERMISSIONS' : {$first:"$END" }}
    }
)

在这里,我尝试“强制” mongo将$ END识别为一个字段,但出现错误在“ INTERMISSIONS..START。$ first”中,以美元($)为前缀的字段“ $ first”为不适用于存储。

文档结构如下

{ 
    "_id" : ObjectId("5f7dabb9c02c0000d2003ec2"), 
    "USUARIO" : "admin", 
    "START" : ISODate("2020-10-07T11:51:21Z"), 
    "INTERMISSIONS" : [ ], 
    "END" : ISODate("2020-10-08T09:39:27Z") 
}

1 个答案:

答案 0 :(得分:1)

使用运算符时,请检查其是否可以将表达式作为参数, 像这里的字段参考。

{ $push: { <field1>: <value1>, ... } }

MongoDB可以做更多的事情,而mongodb> = 4.2则可以使用聚合管道进行更新。

我给你命令,“ q”是查询,“ u”是更新管道, 您可以将其与任何支持mongodb> = 4.2

的驱动程序一起使用
> use testdb
switched to db testdb
> db.testcoll.drop()
true
> db.testcoll.insert(
... { 
...     "_id" : "5f7dabb9c02c0000d2003ec2", 
...     "USUARIO" : "admin", 
...     "START" :ISODate("2020-10-07T11:51:21Z"), 
...     "INTERMISSIONS" : [ ], 
...     "END" : ISODate("2020-10-08T09:39:27Z")
... }
... )
WriteResult({ "nInserted" : 1 })
> db.runCommand(
... {
...   "update": "testcoll",
...   "updates": [
...     {
...       "q": {},
...       "u": [
...         {
...           "$addFields": {
...             "INTERMISSIONS": {
...               "$concatArrays": [
...                 "$INTERMISSIONS",
...                 [
...                   "$END"  //or use {"start" : "$END"},anything you want to add
...                 ]
...               ]
...             }
...           }
...         }
...       ],
...       "multi": false
...     }
...   ]
... }
... )
{ "n" : 1, "nModified" : 1, "ok" : 1 }
> db.testcoll.find({}).pretty();
{
    "_id" : "5f7dabb9c02c0000d2003ec2",
    "USUARIO" : "admin",
    "START" : ISODate("2020-10-07T11:51:21Z"),
    "INTERMISSIONS" : [
        ISODate("2020-10-08T09:39:27Z")
    ],
    "END" : ISODate("2020-10-08T09:39:27Z")
}