2014-03-31 35 views
1

我有一個包含兩個不同(但相似)結構的文檔的集合,其中一些字段具有單個字符串值的字段「someField」,另一些字段具有字段「someField」 -fields。查詢具有不同子字段異構的文檔

我可以查詢以下兩種類型的文檔,當字符串爲字符串時,將someField作爲字符串,並且如果子字段爲,某些子字段? (很容易獲得子字段的字符串或全部

如果您可以格式化子字段以使其看起來像單個字符串文檔,則可以獲得獎勵分數。

包含兩種類型的文件(簡化的例子)

{ 
    "_id" : ObjectId("53345585cdf2fb6a03f4a7bc"), 
    "document" : { 
     "someField" : "Foo 1, Bar 2", 
    } 
} 
{ 
    "_id" : ObjectId("533455sdfghjfb6a03f4a7bc"), 
    "document" : { 
     "someField" : { 
      "foo": "1", 
      "bar": "2", 
      "wibble": "I don't want this field" 
     } 
    } 
} 

額外的信息採集:

最好我到目前爲止是在另一個腳本之後使用兩個查詢,並加入結果放在一起或代碼:

db.someCollection.find(
    { 
     "document.someField.foo":{$exists:false}, 
    }, 
    { 
     "document.someField": 1, 
     _id: 0 
    } 
).forEach(printjson) 

db.someCollection.find(
    { 
     "document.someField.foo":{$exists:true}, 
    }, 
    { 
     "document.someField.foo": 1, 
     "document.someField.bar": 1, 
     _id: 0 
    } 
).forEach(printjson) 

回答

1

你的問題有點抽象,但你可以使用.aggregate()和工作,這種解決方案運營商:

db.collection.aggregate([ 
    { "$project": { 
     "onefield": { "$cond": [ 
      "$document.someField.foo", 
      { 
       "foo": "$document.someField.foo", 
       "bar": "$document.someField.bar" 
      }, 
      "$document.someField" 
     ]} 
    }} 
]) 

這也使得利用三元$cond運營商,以「評估」結果怎麼都去看看。

那麼,你的項目做子文檔場,那麼你可以在「重新塑造」給你想要的字段。當他們不要那麼你可以轉儲字段,如(如果你的邏輯需要它)嵌套進一步$cond操作,以確定如何處理該字段。

當然,如果你真的想要的一切作爲一個字符串,然後使用$concat要做到這一點,而不是:

db.collection.aggregate([ 
    { "$project": { 
     "onefield": { "$cond": [ 
      "$document.someField.foo", 
      { "$concat": [ 
       "Foo ", 
       "$document.someField.foo", 
       " ,Bar ", 
       "$document.someField.bar" 
      ]}, 
      "$document.someField" 
     ]} 
    }} 
]) 
0

我想@Neil-Lunn's answer可能是更好的(我還在努力將其轉化爲我的現實世界的例子),但我設法使用JS函數自己做。 *從我的真實世界簡化,所以可能包含拼寫錯誤。

db.someCollection.find() 
    .forEach(function(o) { 
     if(o.document.someField.foo) { 
      print("Foo " 
       + o.document.someField.foo 
       + ", Bar " 
       + o.document.someField.bar 
      ); 
     } else { 
      print(o.document.someField); 
     } 
    } 
) 

foo是否存在的條件檢查(未定義爲假),然後執行必要一些手動字符串連接時。

+0

你總是可以問你另一個問題「真實世界」的例子。如果你正在使用的數據很大,那麼你會想不做迭代來完成這個轉換。我一定錯過了你想要**的字符串,所以我也更新了這個部分。 –

相關問題