Related
I have a problem with update object nested in array ("companyBases"), because update scripts overwrites my nested object, i have the following model:
{
"_id" : ObjectId("5d6504541be1e64145c20c66"),
"margin" : 10,
"defaultDeprication" : 10,
"companyBases" : [
{
"_id" : ObjectId("5d6504541be1e64145c20c64"),
"name" : "Tech Parking 2",
"street" : "Traktat Ojca",
"postalCode" : "30-856",
"city" : "Cracow",
"location" : {
"lng" : 50.036017,
"lat" : 20.086752
},
"__v" : 0
},
{
"_id" : ObjectId("5d6504541be1e64145c20c65"),
"name" : "Tech Parking 3",
"street" : "ul.Bieżanowska 258B",
"postalCode" : "30-856",
"city" : "Cracow",
"location" : {
"lng" : 50.01744,
"lat" : 20.033522
},
"__v" : 0
}
],
}
I'am executing update query:
db.companies.updateOne(
{
_id: ObjectId("5d6504541be1e64145c20c66"),
"companyBases._id": ObjectId("5d6504541be1e64145c20c64")
},
{
$set: {
"companyBases.$": {
"street" : "ul.Małapolska 123"
}
}
}
)
But it overwrites my nested object and now it looking like this:
{
"_id" : ObjectId("5d6504541be1e64145c20c66"),
"margin" : 10,
"defaultDeprication" : 10,
"companyBases" : [
{
"street" : "ul.Małapolska 123"
},
{
"_id" : ObjectId("5d6504541be1e64145c20c65"),
"name" : "Tech Parking 3",
"street" : "ul.Bieżanowska 258B",
"postalCode" : "30-856",
"city" : "Cracow",
"location" : {
"lng" : 50.01744,
"lat" : 20.033522
},
"__v" : 0
}
],
}
I would like to rewrite all field from nested object and update fields that i choose in update query.
It should looks like this (without overwriting whole object):
{
"_id" : ObjectId("5d6504541be1e64145c20c66"),
"margin" : 10,
"defaultDeprication" : 10,
"companyBases" : [
{
"_id" : ObjectId("5d6504541be1e64145c20c64"),
"name" : "Tech Parking 2",
"street" : "ul.Małapolska 123",
"postalCode" : "30-856",
"city" : "Cracow",
"location" : {
"lng" : 50.036017,
"lat" : 20.086752
},
"__v" : 0
},
{
"_id" : ObjectId("5d6504541be1e64145c20c65"),
"name" : "Tech Parking 3",
"street" : "ul.Bieżanowska 258B",
"postalCode" : "30-856",
"city" : "Cracow",
"location" : {
"lng" : 50.01744,
"lat" : 20.033522
},
"__v" : 0
}
],
}
You should use arrayFilter in the update operation, as described here:
positinal filter for arrays
db.companies.updateOne(
{
_id: ObjectId("5d6504541be1e64145c20c66"),
},
{
$set: {
"companyBases.$[element].street: "ul.Małapolska 123"
}
},
{
arrayFilters: [ {"element._id": ObjectId("5d6504541be1e64145c20c64")} ]
}
)
What i am try to achieve is getting more than one size from collection.below query not working as expected.
shown below is collection.
{
"_id" : ObjectId("59e9c029c817c359508b4568"),
"client_id" : "20",
"device_details" : {
"type" : "others",
"name" : "Google Bot",
"os" : null,
"os_version" : null,
"browser" : null,
"browser_version" : null,
"user_agent" : "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)",
"width" : NumberLong("1024"),
"height" : NumberLong("1024"),
"fingerid" : "c714d8f7eb7d216693c0ddd06cfc0940",
"canvasfingerid" : "84f1922a78572180c7f29f938486c1db",
"webglfingerid" : "24700f9f1986800ab4fcc880530dd0ed",
"hardwarefingerid" : "431171c98112e1f0dfb3b40f617111f9",
"platformos" : "Linux x86_64",
"adblock" : "false",
"donot" : "unknown",
"liedlanguage" : "false",
"liedos" : "false",
"liedbrowser" : "false",
"ratio" : NumberLong("1"),
"depth" : NumberLong("24"),
"language" : "en-US",
"liedresolution" : "false",
"timezoneoffset" : "420",
"regularplugin" : "No plugins found",
"localstorage" : "true",
"sessionstorage" : "true",
"touchsupport" : "false",
"canvas" : "Tracked",
"webgl" : "Unknown",
"hardwareconc" : "8",
"referrer" : null,
"referrer_url" : null,
"scrorientation" : "landscape-primary"
},
"ip_list" : [
"66.249.66.146",
"66.249.66.21"
],
"ip_details" : [
{
"ip_address" : "66.249.66.146",
"latitude" : 37.41919999999999,
"longitude" : -122.0574,
"city" : "Mountain View",
"postal_code" : "94043",
"country_code" : "US",
"country_name" : "United States",
"continent_code" : "NA",
"created_date" : ISODate("2017-10-20T14:51:45.176+05:30")
},
{
"ip_address" : "66.249.66.21",
"latitude" : 37.41919999999999,
"longitude" : -122.0574,
"city" : "Mountain View",
"postal_code" : "94043",
"country_code" : "US",
"country_name" : "United States",
"continent_code" : "NA",
"created_date" : ISODate("2017-10-24T08:27:24.385+05:30")
}
],
"urls" : [
{
"host" : {
"time" : ISODate("2017-10-20T14:51:45.197+05:30"),
"url" : "http://www.indianmobileprices.com/index.php/mobile/info/9-APPLE/7062-APPLE-iPhone+7+/dehradun"
}
},
{
"host" : {
"time" : ISODate("2017-10-24T08:27:24.405+05:30"),
"url" : "http://www.indianmobileprices.com/brand/mobiles/10-LENOVO/bhubaneswar"
}
}
],
"created_date" : ISODate("2017-10-24T08:27:24.405+05:30"),
"current_timestamp" : NumberLong("1508491305"),
"traffic" : null,
"traffic_url" : [
{
"url" : "",
"date" : ISODate("2017-10-20T14:51:45.197+05:30")
},
{
"url" : "",
"date" : ISODate("2017-10-24T08:27:24.314+05:30")
},
{
"url" : "",
"date" : ISODate("2017-10-24T08:27:24.578+05:30")
}
],
"returning_user" : NumberLong("1"),
"returninguser" : "yes",
"updated_timestamp" : NumberLong("1508813844"),
"multisession" : NumberLong("2")
},
Here is the query i have used.
db.audience.aggregate([
{"$group":{
"_id":"$ip_details.country_name",
"device_information":{
"$addToSet":{
"ipaddress":"$ip_details.ip_address",
"country_name":"$ip_details.country_name",
"device_name":"$device_details.name",
"device_type":"$device_details.type",
"device_os":"$device_details.os",
"devicen_osversion":"$device_details.os_version"
}
},
"count":{"$sum":1}
}},
{ "$project":{
"device_information":1,
"_id":0,
"countrySize":{ "$size":"$device_information.country_name" },
"desktopSize":{ "$size":'$device_information.device_type' }
}},
{ "$match":{ "countrySize":{"$gt":1} }},
{ "$match":{"desktopSize":{"$device_information.device_type":"desktop"} }}
])
For that i could not get expected result is given below.need to change query for the result.
/* 1 */
{
"countrySize" : NumberInt("4"),
"desktopSize" : NumberInt("2"),
"device_information" : [
{
"country_name" : [
"Singapore"
],
"device_name" : "generic web browser",
"device_os" : "Windows",
"device_type" : "desktop",
"devicen_osversion" : "10",
"ipaddress" : [
"52.220.245.83"
]
},
{
"country_name" : [
"Singapore"
],
"device_name" : "Apple iPhone",
"device_os" : "iOS",
"device_type" : "others",
"devicen_osversion" : "10.3.3",
"ipaddress" : [
"185.89.218.227"
]
},
{
"country_name" : [
"Singapore"
],
"device_name" : "generic web browser",
"device_os" : "Mac OS X",
"device_type" : "desktop",
"devicen_osversion" : "10.12.6",
"ipaddress" : [
"121.7.242.239"
]
},
{
"country_name" : [
"Singapore"
],
"device_name" : "Samsung Galaxy Note 4",
"device_os" : "Android",
"device_type" : "mobile",
"devicen_osversion" : "6.0.1",
"ipaddress" : [
"220.255.108.72"
]
}
]
},
I need query for results that is given above.
{
"_id" : "WR10005",
"_class" : "com.bioraid.mes.model.WorkOrders",
"rountingNumber" : "R006",
"orderId" : "MR-1017",
"consumables" : "Chip",
"workOrderStatus" : "pending",
"deliveryStatus" : "on time",
"lastCompletedStage" : "testProces",
"dateAssigned" : ISODate("2017-02-17T05:38:57.631Z"),
"dateCompleted" : ISODate("2017-02-17T07:53:32.680Z"),
"opretorProcessStatus" : [
{
"opretorid" : "USER114",
"process" : "testProces",
"status" : "Done",
"workCenterId" : "WC1",
"startDate" : ISODate("2017-02-17T06:30:16.813Z"),
"endDate" : ISODate("2017-02-17T06:42:23.237Z"),
"qualityManagerReview" : {
"qaId" : "",
"status" : "Done",
"note" : ""
}
},
{
"opretorid" : "USER116",
"process" : "testProces",
"status" : "Done",
"workCenterId" : "WC1",
"startDate" : ISODate("2017-02-17T06:30:16.813Z"),
"endDate" : ISODate("2017-02-17T06:42:23.237Z")
}
],
"workOrdersRouting" : {
"testProces" : [
{
"routingStep" : "R006*010",
"operationName" : "Operation1",
"operationStatus" : "Completed",
"operationResult" : "Pass",
"operationNote" : "test"
},
{
"routingStep" : "R006*020",
"operationName" : "adalks",
"operationStatus" : "Completed",
"operationResult" : "Pass",
"operationNote" : "sddsdfsf"
}
],
"Embossing" : [
{
"routingStep" : "R006*030",
"operationName" : "Water Cleaning",
"operationStatus" : "",
"operationResult" : "",
"operationNote" : ""
}
],
"Turbidity" : [
{
"routingStep" : "R006*040",
"operationName" : "Embossing Assembly",
"operationStatus" : "",
"operationResult" : "",
"operationNote" : ""
}
]
}
}
I want to get {'opretorProcessStatus.qualityManagerReview.status' : {$ne : null}} but this is not giving proper result can any one help me to write this.
and other one is db.getCollection('workOrders').find({'opretorProcessStatus.qualityManagerReview.status' : "Done"}).
You can use $elemMatch to get the Document which you need.
To find documents with opretorProcessStatus.qualityManagerReview.status = Done, use this query:
db.getCollection("workOrders").find({"opretorProcessStatus":{"$elemMatch":{""qualityManagerReview.status":"Done"}}})
To find the documents which don't have status as null:
db.getCollection("workOrders").find({"opretorProcessStatus":{"$elemMatch":{""qualityManagerReview.status":{"$ne":null}}}})
I am having trouble with the $group stage in my aggregation. I want to group all the "recentPlays.quiz" values together and count the repeated values, so the end result I want from the aggregation is two fields: the quiz object and the total. In this case it would be something like:
{
"recentPlays" : [
{
"quiz" : {
"author" : "red-tester1",
"title" : "Asdffff Dfasdf"
},
"count": 1
},
{
"quiz" : {
"author" : "red-tester3",
"title" : "Creation Test 2"
},
"count": 1
},
{
"quiz" : {
"author" : "blue-tester1",
"title" : "Finky Fink"
},
"count": 4
}
]
}
Here is the aggregation I have so far:
db.users.aggregate([
{$match: { "recentPlays.date": {$gte:twentyFourHrsAgo}}},
{$project: {"recentPlays.quiz":1, _id:0}}
]).pretty();
Here is that aggregation's output:
MongoDB shell version: 3.2.1
connecting to: videoQuiz
{
"recentPlays" : [
{
"quiz" : {
"author" : "red-tester1",
"title" : "Asdffff Dfasdf"
}
},
{
"quiz" : {
"author" : "red-tester3",
"title" : "Creation Test 2"
}
},
{
"quiz" : {
"author" : "blue-tester1",
"title" : "Finky Fink"
}
},
{
"quiz" : {
"author" : "blue-tester1",
"title" : "Finky Fink"
}
},
{
"quiz" : {
"author" : "blue-tester1",
"title" : "Finky Fink"
}
},
{
"quiz" : {
"author" : "blue-tester1",
"title" : "Finky Fink"
}
}
]
}
Here is the entire collection:
MongoDB shell version: 3.2.1
connecting to: videoQuiz
{
"_id" : ObjectId("580f7be62c6fd3c8065577f5"),
"user" : "blue-tester1",
"email" : "aslfjjcc#lkcjasdc.com",
"createdAt" : ISODate("2016-10-25T15:36:06.933Z"),
"recentPlays" : [
{
"quiz" : {
"author" : "red-tester1",
"title" : "Asdffff Dfasdf"
},
"score" : "0",
"date" : ISODate("2016-10-25T15:36:27.546Z")
},
{
"quiz" : {
"author" : "red-tester3",
"title" : "Creation Test 2"
},
"score" : "100",
"date" : ISODate("2016-10-25T15:37:09.142Z")
}
],
"mostRecentQuiz" : {
"author" : "red-tester3",
"title" : "Creation Test 2"
},
"mostRecentQuizTime" : ISODate("2016-10-25T15:37:09.142Z"),
"plays" : 2
}
{
"_id" : ObjectId("580a5dea650296d808082e65"),
"user" : "red-tester3",
"email" : "aldkdk#ccc.com",
"createdAt" : ISODate("2016-10-21T18:26:50.870Z"),
"recentPlays" : [
{
"quiz" : {
"author" : "red-tester2",
"title" : "TOP PLAYED QUIZ - Today"
},
"score" : "0",
"date" : ISODate("2016-10-21T18:27:16.292Z")
},
{
"quiz" : {
"author" : "red-tester2",
"title" : "TOP LIKED QUIZ - TODAY"
},
"score" : "100",
"date" : ISODate("2016-10-21T18:27:32.788Z")
},
{
"quiz" : {
"author" : "red-tester2",
"title" : "TOP LIKED QUIZ - TODAY"
},
"score" : "100",
"date" : ISODate("2016-10-21T18:27:44.497Z")
},
{
"quiz" : {
"author" : "Bertram",
"title" : "frfrf"
},
"score" : "100",
"date" : ISODate("2016-10-21T18:28:43.893Z")
},
{
"quiz" : {
"author" : "Bertram",
"title" : "Here We Go With the New Thing"
},
"score" : "0",
"date" : ISODate("2016-10-21T18:43:51.205Z")
},
{
"quiz" : {
"author" : "red-tester3",
"title" : "Presidents of the United States"
},
"score" : "0",
"date" : ISODate("2016-10-23T00:53:29.167Z")
},
{
"quiz" : {
"author" : "red-tester3",
"title" : "Presidents of the United States"
},
"score" : "0",
"date" : ISODate("2016-10-23T00:53:44.815Z")
},
{
"quiz" : {
"author" : "red-tester3",
"title" : "Creation Test 1"
},
"score" : "100",
"date" : ISODate("2016-10-23T23:50:55.355Z")
},
{
"quiz" : {
"author" : "red-tester3",
"title" : "Creation Test 2"
},
"score" : "100",
"date" : ISODate("2016-10-23T23:52:33.210Z")
},
{
"quiz" : {
"author" : "red-tester3",
"title" : "Here Is a New Title"
},
"score" : "100",
"date" : ISODate("2016-10-23T23:58:53.683Z")
}
],
"mostRecentQuiz" : {
"author" : "red-tester3",
"title" : "Here Is a New Title"
},
"mostRecentQuizTime" : ISODate("2016-10-23T23:58:53.683Z"),
"plays" : 10,
"likedQuizzes" : [
{
"title" : "TOP LIKED QUIZ - TODAY",
"author" : "red-tester2",
"date" : ISODate("2016-10-21T18:27:34.893Z")
},
{
"title" : "frfrf",
"author" : "Bertram",
"date" : ISODate("2016-10-21T18:28:45.863Z")
},
{
"title" : "Here We Go With the New Thing",
"author" : "Bertram",
"date" : ISODate("2016-10-21T18:43:53.148Z")
}
],
"createdQuizzes" : [
{
"title" : "Yeah Here We Go",
"id" : ObjectId("580a63f274b9a89c061f973e")
},
{
"title" : "Z Alpha",
"id" : ObjectId("580a641474b9a89c061f973f")
},
{
"title" : "Tags Limit Test",
"id" : ObjectId("580a6bda8d8049ac0bc1df2e")
},
{
"title" : "Tags Limit test2",
"id" : ObjectId("580a6bf98d8049ac0bc1df2f")
},
{
"title" : "Presidents of the United States",
"id" : ObjectId("580c09d28d8049ac0bc1df30")
},
{
"title" : "Creation Test 1",
"id" : ObjectId("580d4cca8d8049ac0bc1df31")
},
{
"title" : "Creation Test 2",
"id" : ObjectId("580d4d2d8d8049ac0bc1df32")
},
{
"title" : "Here Is a New Title",
"id" : ObjectId("580d4ead8d8049ac0bc1df33")
}
]
}
Thanks in advance for any guidance. Please excuse the dummy text in these documents, it is for testing purposes only.
This will be a two step process. The first step is to $unwind the "recentPlays" array. The second step is to $group by "recentPlays.quiz".
For example:
db.users.aggregate([
{ "$match" : { "recentPlays.date": { "$gte" : twentyFourHrsAgo}}},
{ "$project" : {"recentPlays.quiz":1, _id:0}},
{ "$unwind" : "$recentPlays" },
{ "$group" : { "_id" : "$recentPlays.quiz", "total" : { "$sum" : 1 } } }
]).pretty();
I have a question on multiple collections in mongoDB.
I have 3 collections in my database and the collections names are Building, History and basic_amenities.
My question is, i want to retrieve the data of building ,history and basi_amenties to a particular building . I mean i want the data from building ,history and basic_amenities.
I want to do using aggregate concept. Is it possible to do like that or else is there any alternative method.
Building:
{
"_id" : "B1",
"Sale_type" : "Rental",
"Building_name" : "swamy",
"Available_apartments" : {
"Apartment_num" : "A6",
"Apartment_num" : "A9"
},
"Owner" : [
"sreekanth Buddha",
"sreekanthb6#gmail.com"
],
"Address" : {
"Street" : "blumenstrasse",
"Plot_no" : "13",
"City" : "Hamburg",
"State" : "lower saxony",
"Country" : "Germany",
"Postal_code" : "68245"
},
"Rental" : {
"Currency" : "EUR",
"Rental_price" : "10000",
"Available_date" : "02.03.2015",
"Deposit_amount" : "60000 EUR"
},
"Total_area" : "1200 sq meters",
"Apartment_id" : [
{
"id1" : "A1"
},
{
"id2" : "A5"
},
{
"id3" : "A7"
},
{
"id4" : "A2"
},
{
"id5" : "A9"
}
],
"Features" : {
"No_of_apartments" : "70",
"Community_hall" : "1",
"Garden" : 3,
"Office_room" : 1,
"Parking" : "yes",
"Play_ground" : "yes"
}
}
History:
"_id" : "H-B1",
"Property_id" : "B1",
"Builtyear" : "April 1995",
"year_of_registration" : [
{
"year" : ISODate("1995-04-15T23:00:00.000Z"),
"name" : "krishna malli"
},
{
"year" : ISODate("2008-07-16T23:00:00.000Z"),
"name" : "manoj kumar alluri"
},
{
"year" : ISODate("2014-10-29T23:00:00.000Z"),
"name" : "Ram dev swamy"
}
],
"Renovate" : [
{
"1995" : " building painting Renovated"
},
{
"2008" : " pipeline system was renovated"
},
{
"2014" : " roof was renovated"
}
]
}
**Basic_amenities:**
{
"_id" : "BA-B1",
"Property_id" : "B1",
"hospital " : "5 km",
"bahn_station" : "6 km ",
"restaurant" : "4 km",
"University" : "20 km",
"police_station" : "8 km",
"Airport" : "40 km",
"city_center" : " 5 km",
"Public_transp_type" : [
{
"Bus" : "35"
},
{
"tram" : "5"
},
{
"train_station" : "5km"
}
],
"keylandmark" : "Altstadt",
"future_activity" : "church constructing"
}
Can anyone help me how to query this data using aggregations concept or else is there any alternative method? please help me
Regards
Sreekanth