Mongodb 根据节点的内容匹配和更新节点

Mongodb 根据节点的内容匹配和更新节点,mongodb,Mongodb,如何在知道doc\u id、par\u id和line\u id的情况下更新右侧节点中的文本字段 我不能使用这个查询,因为我没有对应于par_id和line_id的节点索引 你可以这样做- con.db.col.update( {'_id': doc_id}, {'$set': { "pars.?.lines.?.text": "Bar" } } ) > db.collection.insertOne({ ... "doc_id": 1234, ... "pars

如何在知道doc\u id、par\u id和line\u id的情况下更新右侧节点中的文本字段

我不能使用这个查询,因为我没有对应于par_id和line_id的节点索引


你可以这样做-

con.db.col.update(
    {'_id': doc_id},
    {'$set': { "pars.?.lines.?.text": "Bar" } }
)
> db.collection.insertOne({
...   "doc_id": 1234,
...   "pars": {
...     4567: {
...       "someNode": "...",
...       "lines": [
...         {
...           "line_id": 8901,
...           "someOtherNode": "...",
...           "text": "Foo"
...         },
...       ]
...     }
...   }
... })
{
    "acknowledged" : true,
    "insertedId" : ObjectId("58ecb95e475838c0db6efd9d")
}
> db.collection.updateOne({
...   "doc_id": 1234,
...   "pars.4567.lines.line_id": 8901
... }, {
...   "$set": {"pars.4567.lines.$.text": "Bar"}
... })
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
> db.collection.findOne({"doc_id": 1234})
{
  "_id" : ObjectId("58ecb95e475838c0db6efd9d"),
  "doc_id" : 1234,
  "pars" : {
    "4567" : {
      "someNode" : "...",
      "lines" : [
        {
          "line_id" : 8901,
          "someOtherNode" : "...",
          "text" : "Bar"
        }
      ]
    }
  }
}
,则需要重新排列架构。现在,您有一个段落数组,每个段落都是一个行数组。我建议将段落制作为字段名为段落的文档,而不是数组。可以将这些行保留为数组,然后使用以下命令按paragraphId和lineId进行更新:


$$是特殊运算符新位置运算符


你可以这样做-

con.db.col.update(
    {'_id': doc_id},
    {'$set': { "pars.?.lines.?.text": "Bar" } }
)
> db.collection.insertOne({
...   "doc_id": 1234,
...   "pars": {
...     4567: {
...       "someNode": "...",
...       "lines": [
...         {
...           "line_id": 8901,
...           "someOtherNode": "...",
...           "text": "Foo"
...         },
...       ]
...     }
...   }
... })
{
    "acknowledged" : true,
    "insertedId" : ObjectId("58ecb95e475838c0db6efd9d")
}
> db.collection.updateOne({
...   "doc_id": 1234,
...   "pars.4567.lines.line_id": 8901
... }, {
...   "$set": {"pars.4567.lines.$.text": "Bar"}
... })
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
> db.collection.findOne({"doc_id": 1234})
{
  "_id" : ObjectId("58ecb95e475838c0db6efd9d"),
  "doc_id" : 1234,
  "pars" : {
    "4567" : {
      "someNode" : "...",
      "lines" : [
        {
          "line_id" : 8901,
          "someOtherNode" : "...",
          "text" : "Bar"
        }
      ]
    }
  }
}

可能的重复也值得跟踪JIRA否,不支持两个$运算符。OOPS使用此-:{$set:{pars.lines.$.text:ANY_text____想要的}
db.col.update(
    {"_id": doc_id, "par_id": 4567,  "pars.lines.line_id":8901},
    {$set: { "pars.lines.$$.text":"ANY_TEXT_YOU_WANT" } },
function(){}  //callback function)