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
>>
>
>

Reply via email to