在MongoDB中替换数组中的嵌入式文档

Fre*_*k L 13 documents mongodb

有没有一种简单的方法来替换阵列中的整个嵌入式文档?说替换:

{
   "_id" : "2",
      "name" : "name2",
      "xyz..." : "xyz2..."
}
Run Code Online (Sandbox Code Playgroud)

有:

{
   "_id" : "2",
      "name" : "name6",
      "xyz..." : "xyz5..."
      "morefields..." : "fields..."
}
Run Code Online (Sandbox Code Playgroud)

正在搜索_id(嵌入式).或者我是否需要使用$ set单独替换每个字段?

{
  "_id" : "2",
  "users" : [{
      "_id" : "1",
      "name" : "name1",
      "xyz..." : "xyz1..."
    }, {
      "_id" : "2",
      "name" : "name2",
      "xyz..." : "xyz2..."
    }],
  "name" : "main name"
}
Run Code Online (Sandbox Code Playgroud)

Gat*_* VP 21

您正在使用"对象数组"模式.您可以使用位置运算符,它应该如下所示:

coll.update( {'_id':'2', 'users._id':'2'}, {$set:{'users.$':{ "_id":2,"name":"name6",... }}}, false, true)
Run Code Online (Sandbox Code Playgroud)

根据我的经验,如果对象具有自然ID,则"对象数组"模式不是最佳的.在您的情况下,这可以建模如下:

{
  "_id" : "2",
  "users" : 
    { "1" : { "name" : "name1", "xyz..." : "xyz1..." }, 
      "2" : { "name" : "name2", "xyz..." : "xyz2..." }
    }
  "name" : "main name"
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可以使用点表示法轻松更新所需的项目.

var newValue = {  "name" : "name6", "xyz..." : "xyz5...", "morefields..." : "fields..." };
coll.update({_id: 2}, { $set: { "users.2" : newValue } });
Run Code Online (Sandbox Code Playgroud)

  • 你是对的,第二个结构没有很好的索引.这绝对是一种权衡.但是你无法使用MongoDB优化所有查询.如果您希望此查询速度很快,那么您必须权衡更新的便利性. (3认同)
  • 我正在使用你的第二个模型,但现在我想我将无法索引内部名称字段.如果它是一个数组,那将是users.name,但这里是users.1.name users.2.name? (2认同)