Mongo Find one set of field in nested object - arrays

i have a follwing structure in mongo db
{
"_id" : ObjectId("58e8d3323fe482ef368b4567"),
"productId" : "poe10001134",
"batchdetails" : [
{
"batchidId" : "BD0166",
"batchno" : "BbfN-1444-SBRPX"
},
{
"batchidId" : "BD0167",
"batchno" : "Bff-8444-kfkff"
},
{
"batchidId" : "BD01447",
"batchno" : "Bff-8415-kfkff"
}
]
}
i want to achieve following result
"productId" : "poe10001134"
"batchno" : "Bff-8415-kfkff"
when i execute following query
db.getCollection('table').findOne( {"batchdetails.batchidId" : "BD01447"},{productId:1,"batchidId.batchno":1})
it returns all the batch no
"productId" : "poe10001134"
"batchno" : "BbfN-1444-SBRPX"
"batchno" : "Bff-8444-kfkff"
"batchno" : "Bff-8415-kfkff"

Do it like this:
db.getCollection('table').findOne( {"batchdetails.batchidId" : "BD01447"},
{productId:1,"batchidId.batchno.$":1})
The $ in the projection contains the index of the batchno array element that was matched in the query.

Related

How to lookup in another collection with objectID

collection 'bookborrow'
"_id" : ObjectId("62ebbd1f4d6ab77fe3dad494"),
"userId" : "62ea90c6691228b6157cc0f9",
"data" : {
"todayDate" : "04/08/2022",
"dateofreturn" : "19/08/2022",
"bookid" : "62e53c1ff5d4c45fb7853d9e"
}
}
collection 'bookdetails'
{
"_id" : ObjectId("62e53c1ff5d4c45fb7853d9e"),
"bookname" : "How To Own Your Own Mind",
"bookauthor" : "Napoleon Hill",
"counterbooks" : "2"
}
output look like
"bookname" : "How To Own Your Own Mind",
"todayDate" : "04/08/2022",
"dateofreturn" : "19/08/2022",
bookid is uniq id .it's bookdetails match _id

mongodb updateMany nested array

I've got the following object and want to update
ArrayOne.ArrayTwo.DocumentTypeID from that ID to a different ID:
{
"_id" : NUUID("97cd06e9-3449-45db-be69-fce30ee1f9b8"),
"ArrayOne" : [
{
"ID" : NUUID("70d99c86-414c-401a-9cc9-91661806c10f"),
"ArrayTwo" : [
{
"EvidenceID" : NUUID("0799492a-b312-4832-a830-ce4ff841d5fd"),
"DocumentTypeID" : NUUID("fa67acee-2d56-4174-954f-f1bdc892add0"),
"FileID" : NUUID("e5f433c6-8c7f-008d-6d2a-12a908f91690"),
"FileName" : "testqwerty.pdf",
"AdjudicationStatus" : 0,
"SubmitDateTime" : ISODate("2022-09-12T14:14:15.060Z")
}
],
"Propertyone" : null,
"Propertytwo" : null,
"Propertythree" : 0
}
]
}
Trying to use:
db.getCollection('Collection').updateMany
(
{"ArrayOne.ArrayTwo.DocumentTypeID" : NUUID("FA67ACEE-2D56-4174-954F-F1BDC892ADD0")},
{$set : {"ArrayOne.ArrayTwo.DocumentTypeID" : NUUID("090F89EF-3AAE-45F2-853F-5B8C7B8AC0CA")}}
)
I do not want to specify the element as 'ArrayOne' can have up to 10 elements and so can "ArrayTwo" the DocumentTypeID however has a unique GUID.
Can someone please let me know how I can do this ?
Thanks

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