Yes, you want updateOne() https://docs.mongodb.com/manual/reference/method/db.collection.updateOne/ Not replaceOne() https://docs.mongodb.com/manual/reference/method/db.collection.replaceOne/
However, also look at the upsert option itself as well which does a replace if NO MATCH https://api.mongodb.com/java/3.2/com/mongodb/client/model/UpdateOptions.html which basically prescribes to this kind of handling https://docs.mongodb.com/manual/reference/method/db.collection.update/ Thad +ThadGuidry <https://www.google.com/+ThadGuidry> On Tue, Jun 28, 2016 at 7:26 AM, Bryan Bende <[email protected]> wrote: > I'm not very familiar with MongoDB, but I can see that when using "update" > mode PutMongo does this: > > else { > // update > final boolean upsert = context.getProperty(UPSERT).asBoolean(); > final String updateKey = > context.getProperty(UPDATE_QUERY_KEY).getValue(); > final Document query = new Document(updateKey, doc.get(updateKey)); > > collection.replaceOne(query, doc, new UpdateOptions().upsert(upsert)); > logger.info("updated {} into MongoDB", new Object[] { flowFile }); > } > > I'm wondering if that collection.replaceOne() is the problem, I see there > is collection.updateOne() which sounds more correct here. > > If someone with more MongoDB experience could verify this I would be happy > to open a JIRA and get this changed. > > -Bryan > > On Tue, Jun 28, 2016 at 5:32 AM, Asanka Sanjaya Herath <[email protected] > > wrote: > >> Hi Bryan, >> >> Your suggestion was worked fine. I have another question. This is not >> related to the subject, but it is related to PutMongo processor. How can I >> use put mongo processor to add a new key value pair to an existing >> document? The flow file contains the document object Id. I have set 'mode' >> property to 'update' and 'upsert' property to false and 'update query key' >> property to '_id'. Flow file content is something like this. >> >> { >> _id:ObjectId(577216f0154b943fe8068079) >> expired:true >> } >> >> Without inserting the 'expired:true', it replaces the whole document with >> the given one. So is there a way to insert the new key value pair to >> collection without replacing the whole collection in MongoDB using putmongo >> processor? Your concern regarding this is highly appreciated. >> >> >> >> On Mon, Jun 27, 2016 at 6:43 PM, Asanka Sanjaya Herath < >> [email protected]> wrote: >> >>> Hi Bryan, >>> Thank you for the input. That really helps. I'll try that. >>> >>> On Mon, Jun 27, 2016 at 6:31 PM, Bryan Bende <[email protected]> wrote: >>> >>>> Hello, >>>> >>>> Right now AttributesToJson does treat everything as strings. I remember >>>> a previous discussion about adding support for different types, but I can't >>>> find a JIRA that references this. >>>> >>>> One option to work around this could be to use ReplaceText to construct >>>> the JSON, instead of AttributesToJson. You could set the Replacement Value >>>> property to something like: >>>> >>>> { >>>> "dataSourceId" : "${datasource}", >>>> "filename" : "${filename}", >>>> "sent_date" : ${sent_date}, >>>> "uuid" : "${uuid}", >>>> "originalSource" : "${originalsource}" >>>> } >>>> >>>> Of course using the appropriate attribute names. >>>> >>>> Another option is that in the upcoming 0.7.0 release, there is a new >>>> processor to transform JSON using JOLT. With that processor you may be able >>>> to take the output of AttributesToJson and apply a transform that converts >>>> the date field to remove the quotes. >>>> >>>> Hope that helps. >>>> >>>> -Bryan >>>> >>>> On Mon, Jun 27, 2016 at 8:16 AM, Asanka Sanjaya Herath < >>>> [email protected]> wrote: >>>> >>>>> I'm trying to insert a flow file to MongoDb which has a date record as >>>>> an attribute. First I sent that flow file through an attribute to JSON >>>>> processor, so that all attributes are now converted to a Json document in >>>>> flow file body. When I insert that flow file to Mongodb using PutMongo >>>>> processor, it saves the "sent_date" attribute as a String. I want this to >>>>> be saved as an ISO date object. >>>>> >>>>> My flow file looked like this. >>>>> >>>>> { >>>>> "dataSourceId" : "xxxx", >>>>> "filename" : "979f7bc5-a395-4396-9625-69fdb2c806c6", >>>>> "sent_date" : "Mon Jan 18 04:50:50 IST 2016", >>>>> "uuid" : "77a5ef56-8b23-40ee-93b5-78c6323e0e1c", >>>>> "originalSource" : "ImportedZip" >>>>> } >>>>> >>>>> Then I prepend "ISODate" to "sent_date" attribute using another >>>>> processor. So now my flow file content looks like this. >>>>> { >>>>> "dataSourceId" : "xxxx", >>>>> "filename" : "979f7bc5-a395-4396-9625-69fdb2c806c6", >>>>> "sent_date" : "ISODate('Mon Jan 18 04:50:50 IST 2016')", >>>>> "uuid" : "77a5ef56-8b23-40ee-93b5-78c6323e0e1c", >>>>> "originalSource" : "ImportedZip" >>>>> } >>>>> >>>>> But still It is saved as a string in MongoDB, because of the double >>>>> quotation marks. Is there a way to remove those double quotation marks >>>>> when >>>>> convert using AttributeToJson processor? >>>>> >>>>> Any help is appreciated. >>>>> >>>>> -- >>>>> Thanks, >>>>> Regards, >>>>> ASH >>>>> >>>> >>>> >>> >>> >>> -- >>> Thanks, >>> Regards, >>> ASH >>> >> >> >> >> -- >> Thanks, >> Regards, >> ASH >> > >
