У меня тысячи пользователей, и пользовательские данные выглядят следующим образом.
Некоторые пользователи имеют устройства как [{some data}] (массив), некоторые пользователи имеют устройства как {some data}, а некоторые пользователи имеют устройства как пустые [].
I need mongodb query to find the userslist with devices
{some data}. Here is the sample of my users data.
{
"_id" : ObjectId("56fe07bab95708fa18d45ac4"),
"username" : "abcd",
"devices" : []
},
{
"_id" : ObjectId("56fe07bab95708fa18d45df7"),
"username" : "efgh",
"devices" : [
{
"_id" : ObjectId("5827804ef659a60400e12fcb"),
"devicetype" : "web"
}
],
},
{
"_id" : ObjectId("56fe07bab95708fa18d45ae8"),
"username" : "efgh",
"devices" : {
"_id" : ObjectId("5951ea8b47abe300046ea26e"),
"devicetype" : "web"
}
},
{
"_id" : ObjectId("56fe07bab95708fa18d45b5b"),
"username" : "ijkl",
"devices" : [
{
"_id" : ObjectId("59bd2317eeff3200049a2ba6"),
"devicetype" : "ios"
"devicetoken" : "1abffaa4419d498b48d0bf982"
}
],
},
{
"_id" : ObjectId("56fe07bab95708fa18d46102"),
"username" : "efgh",
"devices" : {
"_id" : ObjectId("58c433da28841d00040d3cdb"),
"devicetype" : "web"
}
},
{
"_id" : ObjectId("56fe07bab95708fa18d46177"),
"username" : "efgh",
"devices" : {
"_id" : ObjectId("59d073d96974d20004a4bb9f"),
"devicetype" : "web"
}
},
{
"_id" : ObjectId("56fe07bab95708fa18d456c9"),
"username" : "ijkl",
"devices" : [
{
"_id" : ObjectId("59b93dd2e6673c00044cca49"),
"devicetype" : "ios"
"devicetoken" : "1abffaa4419d498b48d0bf982"
}
],
},
{
"_id" : ObjectId("56fe07bab95708fa18d456f4"),
"username" : "abcd",
"devices" : []
}Обновил мой ответ ниже.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать оператор $type.
Подробности читайте по ссылке https://docs.mongodb.com/manual/reference/operator/query/type/
Вы можете использовать оператор $type следующим образом
db.collection.find( { "devices" : { $type : "object" } } );
или же
db.collection.find({ "devices": { $not: { $type: "array" } }})
Но как ни странно у меня работает с типом object
db.collection.find({ "devices": { $not: { $type: "array" } } }) подходит для меня, я пробовал это с указанной вами датой.
Обновлять:
Попробуйте выполнить один из следующих запросов в соответствии с вашими требованиями (удалите пустые объекты или оставьте только пустые объекты):
db.device.find( {$and:[ {devices:{ $type : "object" }},{devices:{$not: { $type: "array" }}}], devices:{$ne:{}}} );
db.device.find( {$and:[ {devices:{ $type : "object" }},{devices:{$not: { $type: "array" }}}], devices:{$eq:{}}} );
Посмотрите этот снимок экрана:


Кроме того, обратите внимание, что у вас есть повторяющиеся ключи (_id) в вашем наборе данных, что означает, что эти наборы данных не вставляются в вашу БД. Таким образом, запрос, очевидно, не даст правильных результатов.
Редактировать: OP удалил повторяющиеся ключи из набора данных.
Он хочет этот {}, поэтому просто типы объектов - ни массив, ни пустой массив.
Мне нужен только список пользователей, у которых есть устройства: {} устройства не нужны: [{----}] и устройства: []
@PavankumarDasireddy Понял.
@PavankumarDasireddy Обновил мой ответ, пожалуйста, проверьте его. Сообщите мне, работает ли это!
devices: {} означает устройства в объекте, например: "devices": {"_id": ObjectId ("5a5325442f001203c39193bd"), "devicetype": "web"}
Я понимаю, что мой вопрос в том, получили ли вы желаемый результат из вышеуказанного запроса (обновленный ответ)?
Нет, получено 0 записей
Позвольте нам продолжить обсуждение в чате.
Вероятно, вы захотите проверить, пуст ли массив устройств, а не проверять его тип. Не так ли? Проверьте мой ответ ниже.