How get time on timecurrent on node of Firebase using Angular? - angularjs

I want to show only the time on the view, when use $firebaseArray I get the list of items and i want to get only the time.
Firebase tree
{
"eventmodel" : {
"-KX6kDkufxLg-fLocsN7" : {
"info" : "ok",
"limit" : 2,
"timeCurrentStart" : "29/11/2016 17:38",
},
"-KXBB-R7xAPl65xhlTpg" : {
"info" : "ok",
"limit" : 2,
"timeCurrentStart" : "29/11/2016 17:38",
}
}
}

The Firebase client always retrieves complete nodes. There is no way to get only the timeCurrentStart property of each node.
So either you'll have to store the timeCurrentStart properties in a separate node:
{
"eventmodeltimes" : {
"-KX6kDkufxLg-fLocsN7" : "29/11/2016 17:38",
"-KXBB-R7xAPl65xhlTpg" : "29/11/2016 17:38"
}
}
Or you'll have to retrieve the entire nodes and only show timeCurrentStart:
<span>{{event.timeCurrentStart}}</span>

Related

Retrieving child value of unknown parent Firebase, AngularJS

I have basic project on Firebase, AngularJS.
{
"users" : {
"X3IuXTMi9RgOLMKBoqPJtB1JGGQ2" : {
"profile" : {
"firstName" : "test",
"lastName" : "5",
"username" : "test5"
}
},
"poPg2BfHA1gq3qtXNLbuw4X2Zt23" : {
"profile" : {
"firstName" : "test3",
"lastName" : "asdfg",
"username" : "test3"
}
}
}
}
i want to add users by username basically. when type username on alertprompt(ionic) and click add, it will find target username and get uid on its parent. and it will write data on "users/$targetuid/friendrequests/$senderuid"
my closest search result was that: Retrieve data of child of unknown parent ID - Firebase
but i cant use any .ref codes;
Cannot read property 'ref' of undefined
i just can use FirebaseObjectObservable, what im i doing wrong ? why cant i use
firebase.database().ref
or any like this code based on .ref command?
basically cant do anything here: https://firebase.google.com/docs/database/web/read-and-write
im am sort of new on coding, so if its easy or funny dont laugh much. thanks for reading.
I can see two solutions here:
1) Create a usernameToUserid map: on firebase create a new resource usernameToUserid, ike below:
{
"users" : {
"X3IuXTMi9RgOLMKBoqPJtB1JGGQ2" : {
"profile" : {
"firstName" : "test",
"lastName" : "5",
"username" : "test5"
}
},
"poPg2BfHA1gq3qtXNLbuw4X2Zt23" : {
"profile" : {
"firstName" : "test3",
"lastName" : "asdfg",
"username" : "test3"
}
}
},
"usernameToUserid: {
"test5": "X3IuXTMi9RgOLMKBoqPJtB1JGGQ2",
"test3": "poPg2BfHA1gq3qtXNLbuw4X2Zt23"
}
}
This way you can retrieve the userId and then the user profile with the username.
2) Retrieve all users and search locally for username, terrible idea.

Elasticsearch | Query over array of objects

Lets say I have an object in ES such as:
{
name: "calendar";
events: [
{
birthday: "1992-10-09",
graduation: "2018-06-15",
wedding: "2016-12-12"
}
]
}
Is there a way I can query over the events array to find an element in the events array that is passed the current date.
So far I have:
GET /index/type/_search
{
"query": {
"range" : {
"events" : {
"gte" : "now"
}
}
}
}
but that does not iterate over each object in the array and return the name of the event. For this scenario it should return the object graduation: "2018-06-15". Thanks for the help!
You can use Nested datatypes to store nested documents inside parent document.
And to query back the Nested types you can use Nested Query.

How to find documents in MongoDb matching a field and subdocument field that are in an array

The document structure is as follows:
{
"_id" : "V001-99999999",
"vendor_number" : "V001",
"created_time" : ISODate("2016-04-26T22:15:34Z"),
"updated_time" : ISODate("2016-06-07T21:45:46.413Z"),
"items" : [
{
"sku" : "99999999-1",
"status" : "ACTIVE",
"listing_status" : "LIVE",
"inventory" : 10,
"created_time" : ISODate("2016-05-14T22:15:34Z"),
"updated_time" : ISODate("2016-05-14T20:42:21.753Z"),
},
{
"sku" : "99999999-2",
"status" : "INACTIVE",
"listing_status" : "LIVE",
"inventory" : 10,
"created_time" : ISODate("2016-04-26T22:15:34Z"),
"updated_time" : ISODate("2016-06-06T20:42:21.753Z"),
}
]
}
I want to obtain the sku from the item, the conditions are:
1) "vendor_number" = "XXX"
2) items.status = "ACTIVE" AND items.updated_time < [given_date]
Result example:
"sku" : "99999999-2"
or csv:
"sku","99999999-2"
Thank you for your support.
This should be what you want. Although I'm assuming you wanted "status": "active"?
db.getCollection('collection').aggregate([
{ $match: { "vendor_number": "XXXX" } },
{ $project: {
"items": {
$filter: {
input: "$items",
as: "item",
cond: { $eq: ["$$item.status", "ACTIVE"] } // or maybe ["$$item.listing_status", "LIVE"] ?
}
}
}
},
{ $project: { "items.sku": true } }
])
I love using aggregation to manipulate stuff. It's great all the things you can do with it. So here's what's going on:
The first part is simple. The $match step in the aggregation pipeline says just give me documents where vendor_number is "XXXX".
The next part is a bit hairy. The first projection step creates a new field, called "items", I could have called it "results" or "bob" if I wanted to. The $filter specifies which items should go into this new field. The new "items" field will be an array that will have all the results from the previous items field, hence the input: "$items", where you're using the keyword "item" to represent each input item that comes into the filter. Next, the condition says, for each item, only put it in my new "items" array if the item's status is "ACTIVE". You can change it to ["$$items.listing_status", "LIVE"] if that's what you needed. All of this will pretty much give you you're result.
The last project just get's rid of all other fields except for items.sku in each element in the new "items" array.
Hope this help. Play around with it and see what else you can do with the collection and aggregation. Let me know if you need any more clarification. If you haven't used aggregation before, take a look at the aggregation docs and the list of pipeline operators you can use with aggregation. Pretty handy tool.

Understanding Scan and Scroll in Elasticsearch

Using ES and AngularJS to make a small search app. I'm trying to understand how to implement the scan and scroll feature in ES to use for pagination.
The docs say to make a search request and then to include a 'search_type: scan' and 'scroll' parameters.
Do I just add those parameters to my current search request or do I need to make another search request and specify request as the scan and scroll search request?
As documentation explain you need to make the first call using
GET /old_index/_search?search_type=scan&scroll=1m
{
"query": { "match_all": {}},
"size": 1000
}
The response to this request doesn’t include any hits (means content you search) but scroll id like following
{
"_scroll_id" : "c2Nhbjs1OzMwNTYzMTkxNjpTSkM2S0cxVFJIeUk1NnZWbGFUV1FnOzMwNTYzMTkxNTpTSkM2S0cxVFJIeUk1NnZWbGFUV1FnOzMwNTYyMjEwNzp4OEkwZE54eVR0cXI4cHAzU2I5UmlBOzMwNTYzNTE0NjpQZEhCSUZXeFJZU3daaDJKZXZCRmh3OzMwNTY0OTg4OTphdEE1OTN2NFFsYVY5ZjJ4SUxuVFpROzE7dG90YWxfaGl0czoyOTIwOw==",
"took" : 10,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 2920,
"max_score" : 0,
"hits" : []
}
}
After this you can use normal call with the scroll_id
GET /_search/scroll?scroll=1m&_scroll_idc2Nhbjs1OzMwNTYzMTkxNjpTSkM2S0cxVFJIeUk1NnZWbGFUV1FnOzMwNTYzMTkxNTpTSkM2S0cxVFJIeUk1NnZWbGFUV1FnOzMwNTYyMjEwNzp4OEkwZE54eVR0cXI4cHAzU2I5UmlBOzMwNTYzNTE0NjpQZEhCSUZXeFJZU3daaDJKZXZCRmh3OzMwNTY0OTg4OTphdEE1OTN2NFFsYVY5ZjJ4SUxuVFpROzE7dG90YWxfaGl0czoyOTIwOw==
_scroll_id can be in request or body

Elasticsearch : Set the number of the elements of an array in a field

I'm trying to store the number of elements of an array into a field with an update. (updating the record with the count of the array).
Like for example
{
array = [ { "a" : "b" }, { "c" : "d" } ]
nb_elements = 2
}
I have tried an update with the following script
{
"script" : "ctx._source.nb_elements= ctx._source.array.values.length"
}
But it don't work.
I also tried :
{
"script" : "ctx._source.nb_elements = count",
"params" : {
"count" : ctx._source.array.values.length
}
}
But i wasn't more successfull.
Does anybody know if this is possible and if, how to do it ?
First of all you need to enable dynamic scripting by adding script.disable_dynamic: false to your config file.
Secondly, I'm supposing that you are using groovy (It's the default scripting language from 1.4).
Using the update api with this script should work:
{
"script": "ctx._source.nb_elements=ctx._source.array.size"
}

Resources