0

我对 MongoDB $set & $-operators 有疑问。我尝试修改现有数组

我的更新方法看起来像这样(我无法获得准确的副本,因为它是用 Clojure/Monger 编写的):

    bulk.find({
            _id: 2,
            channelStatuses.channel: {$eq: "BAR"}
    }).update({
            $set: {"channelStatuses.$.status": "error" }
    });

我的数据看起来像这样:

{
  "_id" : "1",
  "channelStatuses" : [
    {
      "channel" : "FOO",
      "status" : "done"
    }
  ]
},
{
  "_id" : "2",
  "channelStatuses" : [
    {
      "channel" : "BAR",
      "status" : "done"
    }
  ]
},
{
  "_id" : "3",
  "channelStatuses" : [
    {
      "channel" : "BAZ",
      "status" : "error"
    }
  ]
},
{
  "_id" : "3",
  "channelStatuses" : []
}

所以我想要它做的是用_id = 2修改文档的channelStatuses-object的状态。

相反,它在 channelStatuses 数组中创建了一个新对象,文档如下所示:

    {
      "_id" : "2",
      "channelStatuses" : [
        {
          "channel" : "BAR",
          "status" : "done"
        },
        {
          "channel" : "BAR",
          "status" : ""
        }
      ]
    },
4

1 回答 1

2

所以我发现你的查询有几个问题。

  1. 在您的文档中,_id字段是一个文本值,但在查询中您将其用作数字。

  2. 在您的查询channelStatuses.channel: {$eq: "BAR"}中无效。除非您用双引号转义,否则JSON 密钥不能包含.在内。

  3. 您可以简化channelStatuses.channel: {$eq: "BAR"}"channelStatuses.channel": "BAR"

现在尝试以下查询,看看它是否有效。

var bulk = db.doc.initializeUnorderedBulkOp();

bulk.find({ 
  _id: "2", 
  "channelStatuses.channel": "BAR" 
  }).update({
            $set: {"channelStatuses.$.status": "error" }
  });

bulk.execute();

它应该只更新现有字段。请参阅下面的最终输出

{ 
    "_id" : "1", 
    "channelStatuses" : [
        {
            "channel" : "FOO", 
            "status" : "done"
        }
    ]
}
{ 
    "_id" : "2", 
    "channelStatuses" : [
        {
            "channel" : "BAR", 
            "status" : "error"
        }
    ]
}
{ 
    "_id" : "3", 
    "channelStatuses" : [
        {
            "channel" : "BAZ", 
            "status" : "error"
        }
    ]
}
于 2016-03-22T12:50:52.497 回答