我输入了一个参数,并使用了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”:“”})显示结果为空。
当我输入空值时,如何打印出所有结果?
答案 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)
接受的答案(至少在当今)不适合该问题。
您可以按以下方式使用$expr运算符:
假设您的参数名称为
tagsParam
,其值可以为Array
或null
db.collections.find({
$or: [
{ $expr: !tagsParam || !tagsParam.length },
{ tags: { $in: paramter } }
]
});
在这种情况下,如果参数值为["happy"]
,null
或什至是空数组[]
,您将获得所需的结果。