MongoDB中的嵌入式符号

MongoDB中的嵌入式符号,mongodb,nosql,Mongodb,Nosql,我不熟悉查询MongoDB,但在过滤存在某些符号的对象时遇到了困难。例如: 我的收藏引擎中有许多对象的结构如下: { "_id" : ObjectId("5c3a5efa6b0526729490cb2f"), "imsi" : "12345", "class_name" : "foo", "decoded_payload" : { "timestamp" : 1547329260, "lock_status" : "LOCKED"

我不熟悉查询MongoDB,但在过滤存在某些符号的对象时遇到了困难。例如:

我的收藏
引擎
中有许多对象的结构如下:

{
    "_id" : ObjectId("5c3a5efa6b0526729490cb2f"),
    "imsi" : "12345",
    "class_name" : "foo",
    "decoded_payload" : {
        "timestamp" : 1547329260,
        "lock_status" : "LOCKED"
    },
    "direction" : "in",
    "created_at" : ISODate("2019-01-12T21:41:14.998Z")
}
我的目标是获取
imsi
为12345的对象,该对象包含
decoded\u有效载荷
,该载荷包含
lock\u状态
(lock status的类型是symbol,而不是string)。许多对象不包含这些键,因此我想过滤掉包含这些键的对象

查询运行,但返回零结果(尽管有许多对象应该返回)。我想知道是否有一个语法错误被忽略了,因为
lock\u status
是symbol类型。这里可能有什么错误

我的问题是:

db.getCollection('engine').find({

$and: [

    {"decoded_payload":{
    $exists: true,
    $elemMatch: {"lock_status":{$exists:true} } 
        }
    },

    {"imsi": "12345"}


    ]})
.sort({"decoded_payload.timestamp":-1}) 
试试这个

db.getCollection('engine')
.find({"imsi": "12345", "decoded_payload": {$exists: true}, "decoded_payload.lock_status":{$exists:true}})
.sort({"decoded_payload.timestamp":-1}) 

这里不需要
$和
,它是隐式的。可以简化为
find({“decoded\u payload.lock\u status”:{$exists:true},“imsi”:“12345”})
。试试这个。