Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据MongoDB集合中以前记录的匹配情况更新新文档字段值_Python_Mongodb_Pymongo - Fatal编程技术网

Python 根据MongoDB集合中以前记录的匹配情况更新新文档字段值

Python 根据MongoDB集合中以前记录的匹配情况更新新文档字段值,python,mongodb,pymongo,Python,Mongodb,Pymongo,我在mongodb集合中拥有以下文档: ID为1-4的记录在记录4-8 [ {id: "1" , name: "archie", age: "25", nationality: "british"}, {id: "2" , name: "archie", age: "25", nationality: "british"}, {id: "3" , name: "john", age: "25", nationality: "british"}, {id: "4"

我在mongodb集合中拥有以下文档:

ID为
1-4
的记录在记录
4-8

[
    {id: "1" , name: "archie", age: "25", nationality: "british"},
    {id: "2" , name: "archie", age: "25", nationality: "british"},
    {id: "3" , name: "john", age: "25", nationality: "british"},
    {id: "4" , name: "alex", age: "27", nationality: "french"},
    {id: "5" , name: "archie", age: "25", nationality: "british", tag: "value2"},
    {id: "6" , name: "archie", age: "25", nationality: "british", tag: "value2"},
    {id: "7" , name: "john", age: "25", nationality: "british"},
    {id: "8" , name: "alex", age: "27", nationality: "french", tag: "value1"}
]
我想添加/更新字段
标记
,该字段的值与以前记录中的
姓名
年龄
国籍
匹配的字段值相同

以下是预期结果:

[
    {id: "1" , name: "archie", age: "25", nationality: "british", tag: "value2"},
    {id: "2" , name: "archie", age: "25", nationality: "british", tag: "value2"},
    {id: "3" , name: "john", age: "25", nationality: "british"},
    {id: "4" , name: "alex", age: "27", nationality: "french", tag: "value1"},
    {id: "5" , name: "archie", age: "25", nationality: "british", tag: "value2"},
    {id: "6" , name: "archie", age: "25", nationality: "british", tag: "value2"},
    {id: "7" , name: "john", age: "25", nationality: "british"},
    {id: "8" , name: "alex", age: "27", nationality: "french", tag: "value1"}
]
实现这一目标的最佳方式是什么

(我正在使用PyMongo)


非常感谢,

您可以基于现有行准备标记值:

> db.coll.insert([     {id: "5" , name: "archie", age: "25", nationality: "british", tag: "value2"},     {id: "6" , name: "archie", age: "25", nationality: "british", tag: "value2"},     {id: "7" , name: "john", age: "25", nationality: "british"},     {id: "8" , name: "alex", age: "27", nationality: "french", tag: "value1"} ]);
BulkWriteResult({
        "writeErrors" : [ ],
        "writeConcernErrors" : [ ],
        "nInserted" : 4,
        "nUpserted" : 0,
        "nMatched" : 0,
        "nModified" : 0,
        "nRemoved" : 0,
        "upserted" : [ ]
})
> var obIns = {id: "1" , name: "archie", age: "25", nationality: "british"};
> db.coll.find({name:obIns.name, nationality: obIns.nationality}).limit(1).forEach(function(o){obIns.tag = o.tag;db.coll.insert(obIns);});
> db.coll.find();
{ "_id" : ObjectId("58ac489e9daf1be6a0d0456a"), "id" : "5", "name" : "archie", "age" : "25", "nationality" : "british", "tag" : "value2" }
{ "_id" : ObjectId("58ac489e9daf1be6a0d0456b"), "id" : "6", "name" : "archie", "age" : "25", "nationality" : "british", "tag" : "value2" }
{ "_id" : ObjectId("58ac489e9daf1be6a0d0456c"), "id" : "7", "name" : "john", "age" : "25", "nationality" : "british" }
{ "_id" : ObjectId("58ac489e9daf1be6a0d0456d"), "id" : "8", "name" : "alex", "age" : "27", "nationality" : "french", "tag" : "value1" }
{ "_id" : ObjectId("58ac48b49daf1be6a0d0456e"), "id" : "1", "name" : "archie", "age" : "25", "nationality" : "british", "tag" : "value2" }
要实现此目的,请使用和多个查询

让我收集以下数据-所有这些查询都将在MongoShell中工作

db.collection.insert([{id: "1" , name: "archie", age: "25", nationality: "british"}, {id: "2" , name: "archie", age: "25", nationality: "british"}, {id: "3" , name: "john", age: "25", nationality: "british"},     {id: "4", name: "alex", age: "27", nationality: "french"}]);
插入后集合中的文档

db.collection.find().pretty()
{
        "_id" : ObjectId("58ac57e742616c14fcf43aaf"),
        "id" : "1",
        "name" : "archie",
        "age" : "25",
        "nationality" : "british"
}
{
        "_id" : ObjectId("58ac57e742616c14fcf43ab0"),
        "id" : "2",
        "name" : "archie",
        "age" : "25",
        "nationality" : "british"
}
{
        "_id" : ObjectId("58ac57e742616c14fcf43ab1"),
        "id" : "3",
        "name" : "john",
        "age" : "25",
        "nationality" : "british"
}
{
        "_id" : ObjectId("58ac57e742616c14fcf43ab2"),
        "id" : "4",
        "name" : "alex",
        "age" : "27",
        "nationality" : "french"
}
更新查询

db.collection.update({name:"archie", age:"25", nationality:"british"}, {$set:{tag:"value2"}}, {multi:true});
请注意,我使用了$set和multi

$set-仅设置现有值之外的新标记

multi-to更新多个文档

执行更新查询后

db.collection.find().pretty()


{
        "_id" : ObjectId("58ac57e742616c14fcf43aaf"),
        "id" : "1",
        "name" : "archie",
        "age" : "25",
        "nationality" : "british",
        "tag" : "value2"
}
{
        "_id" : ObjectId("58ac57e742616c14fcf43ab0"),
        "id" : "2",
        "name" : "archie",
        "age" : "25",
        "nationality" : "british",
        "tag" : "value2"
}
{
        "_id" : ObjectId("58ac57e742616c14fcf43ab1"),
        "id" : "3",
        "name" : "john",
        "age" : "25",
        "nationality" : "british"
}
{
        "_id" : ObjectId("58ac57e742616c14fcf43ab2"),
        "id" : "4",
        "name" : "alex",
        "age" : "27",
        "nationality" : "french"
}

仅具有匹配名称、年龄和国籍的所有文档都将更新。

您可以
db.coll.find({name:“archie”,national:“british”})。限制(1)
以获取标记值并将其分配给行,然后再插入答案。我想知道,是否可以在全局基础上这样做,而不必逐行指定值?可能与聚合管道中的$group函数类似?$group有助于对数据进行分组,但无法在聚合管道中更新文档。如果确实希望在$group中执行此操作,请使用$group-->$project(添加新值-只能为所有匹配文档添加单个标记:值)-->$out(将其写入新集合)