首页 > 解决方案 > MongoDb:直接查询不起作用

问题描述

我不太明白为什么在以下情况下会得到不同的结果:

> db.reference.find({"metadata.values": {address: {location: "barcelona"} } }).count();
0
> db.reference.find({"metadata.values.address.location": "barcelona"}).count();
1

有什么区别?

包含在reference集合中的文档是:

{
        "_id" : "Doc1Ref2",
        "document" : "doc1",
        "metadata" : [
                {
                        "_id" : "Doc1Ref2Mdt1",
                        "user" : "user2",
                        "creationTimestamp" : ISODate("2018-09-24T12:20:56.169Z"),
                        "values" : {
                                "date" : ISODate("2018-09-24T12:20:56.171Z"),
                                "number" : 16,
                                "address" : {
                                        "street" : "Av. Diagonal",
                                        "location" : "barcelona"
                                },
                                "credentials" : [
                                        {
                                                "password" : "pwd",
                                                "login" : "main"
                                        },
                                        {
                                                "password" : "pwd",
                                                "login" : "other",
                                                "creation" : ISODate("2018-09-24T12:20:56.171Z")
                                        }
                                ],
                                "contact" : "contact name",
                                "tags" : [
                                        "tag1",
                                        "tag2"
                                ]
                        }
                }
        ],
        "timestampCreation" : ISODate("2018-09-24T12:20:56.169Z")
}

标签: mongodbmongodb-query

解决方案


第一个查询匹配 wheremetadata.values是一个精确对象 {address: {location: "barcelona"} }的文档,第二个是 where metadata.values有一个address.location等于“barcelona”的对象。

javascript中的等效测试:

if ((document.metadata || {}).values == {address: {location: "barcelona"} }) 

if ((((document.metadata || {}).values || {}).address || {}).location == "barcelona") 

推荐阅读