如何在mongodb中使用null参数?

时间:2015-12-08 14:15:10

标签: mongodb null find

我输入了一个参数,并使用了mongodb。

我的查询是

db.collections.find({"tags":parameter});

当参数为“”(null或“”)时,我想运行查询。

将是

db.collections.find({"tags":""});

返回空值。

如何在mongoDB中使用输入参数null或“”?

修改

对不起我是初学者,很抱歉。

我希望在输入null

时返回所有返回的值

例如,它看起来像我的收藏品,

collections
{    
  "_id": 0,
  "tags": ["happy", "sad", "nice", "bad"]
},
{
  "_id": 1,
  "tags": ["bad", "gloomy"] 
}

我想要与下面相同的结果。

> Db.collections.find ({"tags": ""})
{
  "_id": 0,
  "tags": ["happy", "sad", "nice", "bad"]
},
{
  "_id": 1,
  "tags": ["bad", "gloomy"]
}
// Return all collections.



> Db.collections.find ({"tags": "happy"})
{
  "_id": 0,
  "tags": ["happy", "sad", "nice", "bad"]
}
// Return matching collections.

但是,db.collections.find({“tags”:“”})显示结果为空。

当我输入空值时,如何打印出所有结果?

2 个答案:

答案 0 :(得分:1)

由于null值可以用多种方式表示,因此根据首先写入数据库的语言,您需要使用各种组合。您的查询需要看起来像

db.collection.find({$or:[{"tags":{"$type":"null"}}, {"tags": {"$exists":false}}, {"tags":""}]})

由于BSON具有Null的概念,我们进行类型检查以查看该字段是否存在但是没有值。除此之外,该字段根本不存在,因此必须明确检查。最后,根据语言和字段序列化的方式,可能会出现空字符串。

请注意

{"tags":null}

{"tags":{"$type":"null"}}

基本上是一回事。

这是一个简单的例子

> db.test.insert({"abc":null})
WriteResult({ "nInserted" : 1 })
> db.test.find()
{ "_id" : ObjectId("56670b3072f096ee05a72063"), "abc" : null }
> db.test.find({"abc":{$type:10}})
{ "_id" : ObjectId("56670b3072f096ee05a72063"), "abc" : null }
> db.test.find({"abc":{$type:"null"}})
{ "_id" : ObjectId("56670b3072f096ee05a72063"), "abc" : null }
> db.test.find({"abc":null})
{ "_id" : ObjectId("56670b3072f096ee05a72063"), "abc" : null }
db.test.find({$or:[{"tags":{"$type":"null"}}, {"tags": {"$exists":false}}, {"tags":""}]})
{ "_id" : ObjectId("56670b3072f096ee05a72063"), "abc" : null }

正如您所看到的,它们都有效,尽管最后一个查询是最彻底的测试方法。

编辑OP更改的问题

键入null时找不到所有值。这是一个领域的价值和潜在状态。你需要在这里做一个隐含的$and来得到你想要的东西。

db.collection.find({tags:{$exists:true}, tags:{$in:["happy","sad"]}})

你如何在代码中实际组装它?嗯,这取决于你的语言,但这里有一些伪代码。

def getTags(myTags):
    if (tags is None):
        db.collection.find({ tags: { "$exists": true } })
    else:
        db.collection.find({ tags: { "$exists": true }, tags: {"$in": myTags } })

您还可以使用明确的$and

来变得狡猾
def getTags(myTags):
    query = [{ tags: { "$exists": true } }]
    if (tags is Not None):
        query.add({tags: {"$in": myTags } })
    db.collection.find({ "$and": query })

我希望这能更彻底地回答你的问题。

答案 1 :(得分:0)

接受的答案(至少在当今)不适合该问题。

MongoDB >= 3.6中。

您可以按以下方式使用$expr运算符:

假设您的参数名称为tagsParam,其值可以为Arraynull

db.collections.find({ 
    $or: [ 
       { $expr: !tagsParam || !tagsParam.length }, 
       { tags: { $in: paramter } }
    ] 
});

在这种情况下,如果参数值为["happy"]null或什至是空数组[],您将获得所需的结果。