How to retrieve data from mongodb using scala - arrays

I have connected to mongodb and filter data like this:
val coll = mongoDB.getTable(db, "report")
val query = new BasicDBObject()
query.put("version",getVersion)
val fields = new BasicDBObject()
fields.put("version",1)
fields.put("project",1)
fields.put("uri",1)
fields.put("test",1)
fields.put("browser",1)
val cursor = coll.find(queryObject,fields)
then get a document like this:
{
"_id" : ObjectId("5a968c6cffac6135b09d6cd5"),
"project" : "com.sink.www.helper",
"uri" : "com.sink.www.helper.somketest",
"browser" : "firefox",
"develop" : "scala",
"duration" : "0.61",
"test" : "acceptance"
"version" : "1.0"
"try" : 1
}
{
"_id" : ObjectId("5a968daaffacc7195c2f9b6i"),
"project" : "com.sink.www.helper",
"uri" : "com.sink.www.helper.somketest",
"browser" : "firefox",
"develop" : "scala",
"duration" : "0.62",
"test" : "acceptance"
"version" : "1.0"
"try" : 1
}
{
"_id" : ObjectId("5a968ea5fface1a723ffr246"),
"project" : "com.sink.www.helper",
"uri" : "com.sink.www.helper.somketest",
"browser" : "chrome",
"develop" : "scala",
"duration" : "0.58",
"test" : "acceptance"
"version" : "1.0"
"try" : 1
}
.....
My question is when "version" is specific value like '1.0', then the field try=try + 1, I have write code like this but this will read mongodb every time, this will cost much time:
while (cursor.hasNext())
{
val details = cursor.next()
if (details.get("version").toString() == getVersion && details.get("browser").toString() == getBrowser)
{
try += 1
}
}
because there are much data in mongodb, so it's not adapt to our project. so I want to get specific data to array or others and get to judge then let try+1, I write code like this but report error:
val scenarioArray = coll.find(queryObject,fields).toArray
for (i <- 0 to scenarioArray.length - 1)
{
println(scenarioArray(i))
}
error: value length is not a member of java.util.List[com.mongodb.DBObject]
error: java.util.List[com.mongodb.DBObject] does not take parameters
I don't know how to retrieve the document to array or list or others container, could anyone get to help on this? Thanks.

Related

Arabic text in swift

i have array of objects like this
"sub-specialty" : [
{
"id" : 1,
"title" : "Adult Physiotherapy",
"ar_title" : "علاج طبيعي بالغين",
"name" : "علاج طبيعي بالغين"
},
{
"id" : 2,
"title" : "Pediatric Physiotherapy",
"ar_title" : "علاج طبيعي اطفال",
"name" : "علاج طبيعي اطفال"
},
{
"id" : 3,
"title" : "Sport Injuries",
"ar_title" : "اصابات ملاعب",
"name" : "اصابات ملاعب"
},
{
"id" : 4,
"title" : "Rehabilitation",
"ar_title" : "تأهيل",
"name" : "تأهيل"
}
]
when i use map to grab name only like this
let sub = sub-specialty.map({($0.name ?? "")}).joined(separator: ", ") ?? ""
i got rubbish characters or text is flipped please see the attached image
enter image description here
You need to get the text as String and set wherever you want to set. It will work fine. I have worked with multi languages and this work for me.

GrayLog not displaying messages that are Bulk inserted

I need to migrate millions of records from a SQL database to ES. Currently we insert records in ES via GELF HTTP, but only doing that one record at a time just isn't feasible.
I've been working on this a couple days and am new to both GrayLog and ElasticSearch. I'm trying to find a way to Bulk insert messages into ES and then have them display in GrayLog. I've been using Cerebro to monitor the indexes and the number of messages in each of them. When I do the Bulk insert, the message count does increase in the correct Index, however I can not see them in GrayLog.
Here is what I have:
var _elasticsearchContext = new ElasticsearchContext(ConnectionString, new ElasticsearchMappingResolver());
var connectionSettings = new ConnectionSettings(new Uri(ConnectionString))
.MapDefaultTypeIndices(m => m.Add(typeof(Auditing_Dev), "auditing-dev_0"));
var elasticClient = new ElasticClient(connectionSettings);
var items = new List<Auditing_Dev>();
//I loop through a DataReader creating new Auditing_Dev objects
//and add them to the items collection
var bulkResponse = elasticClient.Bulk(b => b.IndexMany(items, (d, doc) => d.Document(doc).Index("auditing-dev_0").Type("message")));
I get back a valid response and I see the document count increase in Cerebro in the auditing-dev_0 index. When I compare a message that I insert via Bulk to one that is inserted via HTTP request, the indexes and types are the same.
Message I insert:
{
"_index" : "auditing-dev_0",
"_type" : "message",
"_id" : "AVsWWn-jNp2NX1vOria1",
"_version" : 1,
"found" : true,
"_source" : {
"level" : 5,
"origin" : "10.80.3.2",
"success" : true,
"type" : "Company.Enterprise",
"user" : "stupid#dropdown.test",
"gl2_source_input" : "57193c1d0cf25a44afc31c15",
"gl2_source_node" : "5866cc80-382e-4287-ae5b-8a0a68a9a1f1",
"gl2_remote_ip" : "10.100.20.164",
"gl2_remote_port" : 52273,
"streams" : [ "578fbabe738a897c6d91336b" ]
}
}
Compared to one inserted via HTTP:
{
"_index" : "auditing-dev_0",
"_type" : "message",
"_id" : "e3d34d50-0a8a-11e7-84bb-00155d007a32",
"_version" : 1,
"found" : true,
"_source" : {
"level" : 5,
"gl2_remote_ip" : "192.168.211.114",
"origin" : "192.168.211.35",
"gl2_remote_port" : 2960,
"streams" : [ "578fbabe738a897c6d91336b" ],
"gl2_source_input" : "57193c1d0cf25a44afc31c15",
"success" : "True",
"gl2_source_node" : "5866cc80-382e-4287-ae5b-8a0a68a9a1f1",
"user" : "admin#purple-pink.test",
"timestamp" : "2017-03-16 22:43:44.000"
}
}
I see the _id is a different format, but does that matter?
In GrayLog there is only one Input and that is the one for GELF HTTP. Do I need to add a new Input?
Turned out to be the Timestamp field not being present. Who knew?

MongoDB month query on array records

I have one json object in mongodb which looks like this.
JSON Object :
{
"_id" : ObjectId("58736cfc7d43c305461cdba7"),
"pb_event" : [
{
"event_type" : "Birthday",
"event_date" : ISODate("2016-05-09T13:01:11.967+0000")
},
{
"event_type" : "Aniversary",
"event_date" : ISODate("2016-06-09T13:01:11.967+0000")
}
]
}
When i try below query :
db.temp.aggregate({$project : {month : {$month : "$pb_event.event_date"}}} )
It gives me error like this :
"Can't Convert from BSON type array To date"

Update a single field to array in mongodb using JAVA

I have documents of below format:
{
"_id" : ObjectId("559bae5df3fcf46e468a9779"),
"CPF" : "129-87-716",
"NAME" : "Donald Carver",
"CONTACT" : 1827626847,
"ADDRESS" : "937 Hamburg Path",
"EMAIL_ADDRESS" : "constpherd#yah00.net",
"CARDS" : {
"CREDIT_CARD_NUMBER" : "1678-768-420-4188",
"CARD_TYPE" : "IVISA",
"EXPIRY_DATE" : "Mon May 21 15:23:53 IST 2018"
}
}
I want to update an array of document .
"TRANSACTIONS":[{"TRANSACTION_NUMBER":"1","TRANSACTION_DATE":"07/07/2015","BANK_ID":"200","AMOUNT":100},
{"TRANSACTION_NUMBER":"2","TRANSACTION_DATE":"08/07/2015","BANK_ID":"0","AMOUNT":200},
{"TRANSACTION_NUMBER":"3","TRANSACTION_DATE":"06/07/2015","BANK_ID":"200","AMOUNT":100}
]
}
And it should look like below:
{
"_id" : ObjectId("559bae5df3fcf46e468a9779"),
"CPF" : "129-87-716",
"NAME" : "Donald Carver",
"CONTACT" : 1827626847,
"ADDRESS" : "937 Hamburg Path",
"EMAIL_ADDRESS" : "constpherd#yah00.net",
"CARDS" : {
"CREDIT_CARD_NUMBER" : "1678-768-420-4188",
"CARD_TYPE" : "IVISA",
"EXPIRY_DATE" : "Mon May 21 15:23:53 IST 2018"
}
"TRANSACTIONS":[{"TRANSACTION_NUMBER":"1","TRANSACTION_DATE":"07/07/2015","BANK_ID":"200","AMOUNT":100},
{"TRANSACTION_NUMBER":"2","TRANSACTION_DATE":"08/07/2015","BANK_ID":"0","AMOUNT":200},
{"TRANSACTION_NUMBER":"3","TRANSACTION_DATE":"06/07/2015","BANK_ID":"200","AMOUNT":100}
]
}
}
This is what I am trying to do it using java:
String[] creditcard = line.split(cvsSplitBy);
DBObject listItem = new BasicDBObject("TRANSACTION", new BasicDBObject("TRANSACTION_NUMBER",creditcard[1])
.append("TRANSACTION_DATE",creditcard[2])
.append("TRANSACTION_TYPE",creditcard[3])
.append("BANK_ID",creditcard[4])
.append("AMOUNT",creditcard[5])
);
DBObject updateQuery = new BasicDBObject("$push", listItem);
userimage.update(new BasicDBObject().append("CARDS.CREDIT_CARD_NUMBER", creditcard[0]), updateQuery);
The program updates one row when I run for the first time.When I run second time the program does not insert any doc into the array ...
I am not able to find out the logical error in the program..

update nth document in a nested array document in mongodb

I need to update a document in an array inside another document in Mongo DB
{
"_id" : ObjectId("51cff693d342704b5047e6d8"),
"author" : "test",
"body" : "sdfkj dsfhk asdfjad ",
"comments" : [
{
"author" : "test",
"body" : "sdfkjdj\r\nasdjgkfdfj",
"email" : "test#tes.com"
},
{
"author" : "hola",
"body" : "sdfl\r\nhola \r\nwork here"
}
],
"date" : ISODate("2013-06-30T09:12:51.629Z"),
"permalink" : "jaiho",
"tags" : [
"jaiho"
],
"title" : "JAiHo"
}
Q1) Update email of 0th element of comments array
db.posts.update({"permalink" : "haha"},{$set:{"comments.0.email":1}})
This doesn't throw any exception but doesn't update anything as well
Q2) Add a field on nth element of comments array number_likes
db.posts.update({"permalink" : "haha"},{$inc:{"comments.0.num_likes":1}})
Doesn't work either.
Am I missing something here?
Q1: If you update with permalink 'jaiho' instead of 'haha', it most certainly updates the email;
> db.posts.update({"permalink" : "jaiho"},{$set:{"comments.0.email":1}})
> db.posts.find()
..., "email" : 1 },...
Q2: Same goes for this include;
> db.posts.update({"permalink" : "jaiho"},{$inc:{"comments.0.num_likes":1}})
> db.posts.find()
..., "num_likes" : 1 },...
If you are trying to do it dynamically in Node JS following should work.
i = 0;
selector = {};
operator = {};
selector['comments.' + i + '.email'] = 1; // {'comments.0.num_likes' : 1}
operator['$inc'] = selector; // {'$inc' : {'comments.0.num_likes' : 1} }
db.posts.update({'permalink' : 'xyz'}, operator);

Resources