我的文档中有以下结构:
{
_id : ObjectId("43jh4j343j4j"),
array : [
{
_arrayId : ObjectId("dsd87dsa9d87s9d7"),
someField : "something",
someField2 : "something2"
},
{
_arrayId : ObjectId("sds9a0d9da0d9sa0"),
someField : "somethingElse",
someField2 : "somethingElse2"
}
]
}
我想更新 someField 和 someField2 ,但仅针对数组中的一个项目,即匹配 _arrayId 的项目(例如{ {1}};仅适用于此文档(例如_arrayId : ObjectId("dsd87dsa9d87s9d7")
),而不适用于其他文档。
arrayIds 对于文档来说并不是唯一的,这就是我需要它来用于特定文档的原因。如果我想在数组中为它所存在的每个文档更新该值,我可以使用_id : ObjectId("43jh4j343j4j")
,但这不是我想要的。
我试图在java中完成此任务,但命令行解决方案也可以。
答案 0 :(得分:20)
这是RameshVel的解决方案转换为java:
DB db = conn.getDB( "yourDB" );
DBCollection coll = db.getCollection( "yourCollection" );
ObjectId _id = new ObjectId("4e71b07ff391f2b283be2f95");
ObjectId arrayId = new ObjectId("4e639a918dca838d4575979c");
BasicDBObject query = new BasicDBObject();
query.put("_id", _id);
query.put("array._arrayId", arrayId);
BasicDBObject data = new BasicDBObject();
data.put("array.$.someField", "updated");
BasicDBObject command = new BasicDBObject();
command.put("$set", data);
coll.update(query, command);
答案 1 :(得分:14)
您仍然可以使用$ positional
运算符来完成此操作。但是您需要指定父文档的objectid以及_arrayid过滤器。以下命令行查询工作正常
db.so.update({_id:ObjectId("4e719eb07f1d878c5cf7333c"),
"array._arrayId":ObjectId("dsd87dsa9d87s9d7")},
{$set:{"array.$.someField":"updated"}})
答案 2 :(得分:1)
由于没有一个答案能真正说明如何使用Java和b)嵌套数组项中的多个字段来执行此操作,因此这是mongo-java-driver 3.12.3的解决方案。
import com.mongodb.client.MongoCollection;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.Updates;
import org.bson.Document;
import org.bson.types.ObjectId;
MongoClient mongoClient = MongoClients.create(...);
MongoDatabase db = mongoClient.getDatabase("testDb");
MongoCollection<Document> collection = db.getCollection("testCollection");
collection.updateOne(
Filters.and(
Filters.eq("_id", new ObjectId("43jh4j343j4j")),
Filters.eq("array._arrayId", new ObjectId("dsd87dsa9d87s9d7"))
),
Updates.combine(
Updates.set("array.$.someField", "new value 1"),
Updates.set("array.$.someField2", "new value 2")
)
);
该线程帮助我找到了正确的解决方案,但是我必须对整个解决方案进行更多的研究,因此希望其他人也将从我的回答中受益。
答案 3 :(得分:0)
...这是使用mongo驱动程序版本> = 3.1的方法(我的是3.2.2):
const array = ['foo', 'bar']
const filteredArray = array.filter(element => !element.includes('f'))
console.log(filteredArray)