이를 위해 $addFields를 사용합니다. 그 안에서 $objectToArray를 사용하여 키와 값의 형태로 데이터를 가져옵니다. $indexOfBytes와 함께 $filter를 사용하여 키가 있는지 확인합니다. 그 안에.
먼저 문서로 컬렉션을 생성해 보겠습니다. −
> db.demo364.insertOne(
... {
... "details" : {
... "details1.otherdetails.Name" : {"FirstName":"Chris" }
... }
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e57d485d0ada61456dc936d")
}
> db.demo364.insertOne(
... {
... "details" : {
... "details1.otherdetails.Name" : {"FirstName":"David" }
... }
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e57d486d0ada61456dc936e")
} find() 메서드를 사용하여 컬렉션의 모든 문서 표시 -
> db.demo364.find();
이것은 다음과 같은 출력을 생성합니다 -
{ "_id" : ObjectId("5e57d485d0ada61456dc936d"), "details" : { "details1.otherdetails.Name" : { "FirstName" : "Chris" } } }
{ "_id" : ObjectId("5e57d486d0ada61456dc936e"), "details" : { "details1.otherdetails.Name" : { "FirstName" : "David" } } } 다음은 점이 포함된 키가 있는 레코드를 찾는 쿼리입니다 -
> db.demo364.aggregate([
... {
... $addFields: {
... result: {
... $filter: {
... input: { $objectToArray: "$details" },
... cond: {
... $ne: [ { $indexOfBytes: [ "$$this.k", "." ] } , -1 ]
... }
... }
... }
... }
... },
... {
... $match: {
... $expr: {
... $ne: [ { $size: "$result" }, 0 ]
... }
... }
... },
... {
... $project: {
... result: 0
... }
... }
... ]) 이것은 다음과 같은 출력을 생성합니다 -
{ "_id" : ObjectId("5e57d485d0ada61456dc936d"), "details" : { "details1.otherdetails.Name" : { "FirstName" : "Chris" } } }
{ "_id" : ObjectId("5e57d486d0ada61456dc936e"), "details" : { "details1.otherdetails.Name" : { "FirstName" : "David" } } }